Files
BeWoPlaner/BeWoPlanerMobil/Util/PasswordUtils.cs

231 lines
7.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using BeWo.Data.Access;
using BS.Shared.DataContracts;
namespace BeWoPlanerMobil.Util
{
internal class PasswordUtils
{
private const string Numbers = "0123456789";
private const string LowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
private const string UppercaseLetters = "ABDEFGHIJKLMNOPQRSTUVWXYZ";
private const string LowercaseUmlauts = "äöüß";
private const string UppercaseUmlauts = "ÄÖÜ";
private const string SpecialCharacters1 = "\\\"\'µ@€!";
private const string SpecialCharacters2 = "&/()=?+#*";
private const string SpecialCharacters3 = ",.-;:_><|";
private const string SpecialCharacters4 = "§$%'{[]}´";
private const string SpecialCharacters5 = "`^°~²³";
private string _PartialPassword = string.Empty;
private bool _IsPartial;
private int _PasswordLengthDifference;
private int _Score;
private int _PreviousValue;
private bool _Schalter;
private List<int> _PreviousValues = new List<int>();
public int EvaluatePasswordStrength(string passwordToEvaluate)
{
var passwordStrength = 0;
_PreviousValue = 0;
if(string.IsNullOrWhiteSpace(passwordToEvaluate))
{
return 0;
}
if(_IsPartial)
{
if(_PasswordLengthDifference == 1)
{
_Score -= _PreviousValues.Last();
_PreviousValues.RemoveAt(_PreviousValues.Count - 1);
}
else
{
for(var i = 0; i < _PasswordLengthDifference; i++)
{
_Score += _PreviousValues.Last();
_PreviousValues.RemoveAt(_PreviousValues.Count - 1);
}
}
_IsPartial = false;
}
else
{
var passwordLength = passwordToEvaluate.Length;
if(passwordLength > 5 && passwordLength < 9)
{
AddLengthScore(1);
}
if(passwordLength > 8 && passwordLength < 12)
{
AddLengthScore(2);
}
if(passwordLength > 11 && passwordLength < 18)
{
AddLengthScore(3);
}
if(passwordLength > 17)
{
AddLengthScore(4);
}
// Ziffern
if(passwordToEvaluate.Any(character => Numbers.Contains(character)))
{
AddTokenScore(3);
}
// Großbuchstaben
if(passwordToEvaluate.Any(character => UppercaseLetters.Contains(character)))
{
AddTokenScore(3);
}
// Großumlaute
if(passwordToEvaluate.Any(character => UppercaseUmlauts.Contains(character)))
{
AddTokenScore(2);
}
// Kleinbuchstaben
if(passwordToEvaluate.Any(character => LowercaseLetters.Contains(character)))
{
AddTokenScore(2);
}
// Kleinumlaute
if(passwordToEvaluate.Any(character => LowercaseUmlauts.Contains(character)))
{
AddTokenScore(2);
}
// Sonderzeichen
if(passwordToEvaluate.Any(character => SpecialCharacters1.Contains(character)))
{
AddTokenScore(4);
}
if(passwordToEvaluate.Any(character => SpecialCharacters2.Contains(character)))
{
AddTokenScore(4);
}
if(passwordToEvaluate.Any(character => SpecialCharacters3.Contains(character)))
{
AddTokenScore(4);
}
if(passwordToEvaluate.Any(character => SpecialCharacters4.Contains(character)))
{
AddTokenScore(4);
}
if(passwordToEvaluate.Any(character => SpecialCharacters5.Contains(character)))
{
AddTokenScore(4);
}
_PreviousValues.Add(_PreviousValue);
}
if(_Score < 16)
{
passwordStrength = 0;
}
if(_Score > 15 && _Score < 56)
{
passwordStrength = 1;
}
if(_Score > 55 && _Score < 116)
{
passwordStrength = 2;
}
if(_Score > 115 && _Score < 156)
{
passwordStrength = 3;
}
if(_Score > 155)
{
passwordStrength = 4;
}
return passwordStrength;
}
private void AddLengthScore(int valueToAdd)
{
_Score += valueToAdd;
_PreviousValue = valueToAdd;
_Schalter = true;
}
private void AddTokenScore(int valueToAdd)
{
_Score += valueToAdd;
if(_Schalter)
{
_PreviousValue += valueToAdd;
}
else
{
_PreviousValue = valueToAdd;
}
}
public string CheckPassword(string newPassword)
{
if(string.IsNullOrEmpty(newPassword))
{
return "Das Passwort muss mindestens 8 Zeichen lang sein!";
}
var passwordLength = newPassword.Length;
if(passwordLength < 8)
{
return "Das Passwort muss mindestens 8 Zeichen lang sein!";
}
var richtliniencount = 0;
if(newPassword.Any(character => Numbers.Contains(character)))
{
richtliniencount++;
}
if(newPassword.Any(character => LowercaseLetters.Contains(character) || LowercaseUmlauts.Contains(character)))
{
richtliniencount++;
}
if(newPassword.Any(character => UppercaseLetters.Contains(character) || UppercaseUmlauts.Contains(character)))
{
richtliniencount++;
}
if(newPassword.Any(character => SpecialCharacters1.Contains(character) || SpecialCharacters2.Contains(character) || SpecialCharacters3.Contains(character) || SpecialCharacters4.Contains(character) || SpecialCharacters5.Contains(character)))
{
richtliniencount++;
}
return richtliniencount < 3 ? "Das Passwort muss mindestens drei Zeichen aus der Gruppe Sonderzeichen, Zahlen, Groß- und Kleinbuchstaben enthalten." : null;
}
}
}