added passwordgenerator
This commit is contained in:
parent
f62d5d908d
commit
3039a9af99
@ -41,6 +41,7 @@
|
|||||||
<Reference Include="System.Xml" />
|
<Reference Include="System.Xml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="PasswordGenerator.cs" />
|
||||||
<Compile Include="PasswordStrength.cs" />
|
<Compile Include="PasswordStrength.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
168
Mk0.Tools.Password/PasswordGenerator.cs
Normal file
168
Mk0.Tools.Password/PasswordGenerator.cs
Normal file
@ -0,0 +1,168 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace Mk0.Tools.Password
|
||||||
|
{
|
||||||
|
public class PasswordGenerator
|
||||||
|
{
|
||||||
|
private int minLength = 8;
|
||||||
|
private int maxLength = 128;
|
||||||
|
private int maxAttempts = 10000;
|
||||||
|
|
||||||
|
private const string LOWERCASE_CHARACTERS = "abcdefghijklmnopqrstuvwxyz";
|
||||||
|
private const string UPPERCASE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||||
|
private const string NUMERIC_CHARACTERS = "0123456789";
|
||||||
|
private const string SPECIAL_CHARACTERS = @"!#$%&*@\";
|
||||||
|
|
||||||
|
private int length;
|
||||||
|
private bool lowercase;
|
||||||
|
private bool uppercase;
|
||||||
|
private bool numeric;
|
||||||
|
private bool specialchars;
|
||||||
|
|
||||||
|
public PasswordGenerator()
|
||||||
|
{
|
||||||
|
length = 8;
|
||||||
|
lowercase = true;
|
||||||
|
uppercase = true;
|
||||||
|
numeric = true;
|
||||||
|
specialchars = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PasswordGenerator(int length)
|
||||||
|
{
|
||||||
|
this.length = length;
|
||||||
|
lowercase = true;
|
||||||
|
uppercase = true;
|
||||||
|
numeric = true;
|
||||||
|
specialchars = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PasswordGenerator(bool lowercase = true, bool uppercase = true, bool numeric = true, bool specialchars = true)
|
||||||
|
{
|
||||||
|
length = 8;
|
||||||
|
this.lowercase = lowercase;
|
||||||
|
this.uppercase = uppercase;
|
||||||
|
this.numeric = numeric;
|
||||||
|
this.specialchars = specialchars;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PasswordGenerator(int length, bool lowercase = true, bool uppercase = true, bool numeric = true, bool specialchars = true)
|
||||||
|
{
|
||||||
|
this.length = length;
|
||||||
|
this.lowercase = lowercase;
|
||||||
|
this.uppercase = uppercase;
|
||||||
|
this.numeric = numeric;
|
||||||
|
this.specialchars = specialchars;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Next()
|
||||||
|
{
|
||||||
|
string password;
|
||||||
|
if (!LengthIsValid())
|
||||||
|
|
||||||
|
{
|
||||||
|
password = string.Format("Password length invalid. Must be between {0} and {1} characters long", minLength, maxLength);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int passwordAttempts = 0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
password = GenerateRandomPassword();
|
||||||
|
passwordAttempts++;
|
||||||
|
}
|
||||||
|
while (passwordAttempts < maxAttempts && !PasswordIsValid(password));
|
||||||
|
|
||||||
|
password = PasswordIsValid(password) ? password : "Try again";
|
||||||
|
}
|
||||||
|
|
||||||
|
return password;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string BuildCharacterSet()
|
||||||
|
{
|
||||||
|
StringBuilder characterSet = new StringBuilder();
|
||||||
|
if (lowercase)
|
||||||
|
{
|
||||||
|
characterSet.Append(LOWERCASE_CHARACTERS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uppercase)
|
||||||
|
{
|
||||||
|
characterSet.Append(UPPERCASE_CHARACTERS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (numeric)
|
||||||
|
{
|
||||||
|
characterSet.Append(NUMERIC_CHARACTERS);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (specialchars)
|
||||||
|
{
|
||||||
|
characterSet.Append(SPECIAL_CHARACTERS);
|
||||||
|
}
|
||||||
|
|
||||||
|
return characterSet.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GenerateRandomPassword()
|
||||||
|
{
|
||||||
|
const int MAXIMUM_IDENTICAL_CONSECUTIVE_CHARS = 2;
|
||||||
|
char[] password = new char[length];
|
||||||
|
|
||||||
|
char[] characters = BuildCharacterSet().ToCharArray();
|
||||||
|
char[] shuffledChars = Shuffle(characters.Select(x => x)).ToArray();
|
||||||
|
|
||||||
|
string shuffledCharacterSet = string.Join(null, shuffledChars);
|
||||||
|
int characterSetLength = shuffledCharacterSet.Length;
|
||||||
|
|
||||||
|
Random random = new Random();
|
||||||
|
for (int characterPosition = 0; characterPosition < length; characterPosition++)
|
||||||
|
{
|
||||||
|
password[characterPosition] = shuffledCharacterSet[random.Next(characterSetLength - 1)];
|
||||||
|
|
||||||
|
bool moreThanTwoIdenticalInARow =
|
||||||
|
characterPosition > MAXIMUM_IDENTICAL_CONSECUTIVE_CHARS
|
||||||
|
&& password[characterPosition] == password[characterPosition - 1]
|
||||||
|
&& password[characterPosition - 1] == password[characterPosition - 2];
|
||||||
|
|
||||||
|
if (moreThanTwoIdenticalInARow)
|
||||||
|
{
|
||||||
|
characterPosition--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return string.Join(null, password);
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool PasswordIsValid(string password)
|
||||||
|
{
|
||||||
|
const string REGEX_LOWERCASE = @"[a-z]";
|
||||||
|
const string REGEX_UPPERCASE = @"[A-Z]";
|
||||||
|
const string REGEX_NUMERIC = @"[\d]";
|
||||||
|
const string REGEX_SPECIAL = @"([!#$%&*@\\])+";
|
||||||
|
|
||||||
|
bool lowerCaseIsValid = !lowercase || (lowercase && Regex.IsMatch(password, REGEX_LOWERCASE));
|
||||||
|
bool upperCaseIsValid = !uppercase || (uppercase && Regex.IsMatch(password, REGEX_UPPERCASE));
|
||||||
|
bool numericIsValid = !numeric || (numeric && Regex.IsMatch(password, REGEX_NUMERIC));
|
||||||
|
bool specialIsValid = !specialchars || (specialchars && Regex.IsMatch(password, REGEX_SPECIAL));
|
||||||
|
|
||||||
|
return lowerCaseIsValid && upperCaseIsValid && numericIsValid && specialIsValid && LengthIsValid();
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool LengthIsValid()
|
||||||
|
{
|
||||||
|
return length >= minLength && length <= maxLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerable<T> Shuffle<T>(IEnumerable<T> items)
|
||||||
|
{
|
||||||
|
return from item in items orderby Guid.NewGuid() ascending select item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
|
|||||||
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
|
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
|
||||||
// indem Sie "*" wie unten gezeigt eingeben:
|
// indem Sie "*" wie unten gezeigt eingeben:
|
||||||
// [assembly: AssemblyVersion("1.0.*")]
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
[assembly: AssemblyVersion("1.0.0.0")]
|
[assembly: AssemblyVersion("1.1.0.0")]
|
||||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
[assembly: AssemblyFileVersion("1.1.0.0")]
|
||||||
|
Loading…
Reference in New Issue
Block a user