This blog post has moved to my new blog, you are about to be redirected...
In an earlier post, I wrote a Random Password Generator class intended for anyone interested to plug into their application.
Following some input I received, I have refactored the code a bit:
Following some input I received, I have refactored the code a bit:
using System; using System.Security.Cryptography; namespace Security { public class RandomPasswordGenerator { // Define default password length. private static int DEFAULT_PASSWORD_LENGTH = 8; //No characters that are confusing: i, I, l, L, o, O, 0, 1, u, v public static string PASSWORD_CHARS_ALPHA = "abcdefghjkmnpqrstwxyzABCDEFGHJKMNPQRSTWXYZ"; public static string PASSWORD_CHARS_NUMERIC = "23456789"; public static string PASSWORD_CHARS_SPECIAL = "*$-+?_&=!%{}/"; public static string PASSWORD_CHARS_ALPHANUMERIC = PASSWORD_CHARS_ALPHA + PASSWORD_CHARS_NUMERIC; public static string PASSWORD_CHARS_ALL = PASSWORD_CHARS_ALPHANUMERIC + PASSWORD_CHARS_SPECIAL; //These overloads are only necesary in versions of .NET below 4.0 #region Overloads ////// Generates a random password with the default length. /// ///Randomly generated password. public static string Generate() { return Generate(DEFAULT_PASSWORD_LENGTH, PASSWORD_CHARS_ALL); } ////// Generates a random password with the default length. /// ///Randomly generated password. public static string Generate(string passwordChars) { return Generate(DEFAULT_PASSWORD_LENGTH, passwordChars); } ////// Generates a random password with the default length. /// ///Randomly generated password. public static string Generate(int passwordLength) { return Generate(passwordLength, PASSWORD_CHARS_ALL); } ////// Generates a random password. /// ///Randomly generated password. public static string Generate(int passwordLength, string passwordChars) { return GeneratePassword(passwordLength, passwordChars); } #endregion ////// Generates the password. /// ///private static string GeneratePassword(int passwordLength, string passwordCharacters) { if (passwordLength < 0) throw new ArgumentOutOfRangeException("Password Length"); if (string.IsNullOrEmpty(passwordCharacters)) throw new ArgumentOutOfRangeException("Password Characters"); var password = new char[passwordLength]; var random = GetRandom(); for (int i = 0; i < passwordLength; i++) password[i] = passwordCharacters[ random.Next(passwordCharacters.Length)]; return new string(password); } /// /// Gets a random object with a real random seed /// ///private static Random GetRandom() { // Use a 4-byte array to fill it with random bytes and convert it then // to an integer value. byte[] randomBytes = new byte[4]; // Generate 4 random bytes. new RNGCryptoServiceProvider().GetBytes(randomBytes); // Convert 4 bytes into a 32-bit integer value. int seed = (randomBytes[0] & 0x7f) << 24 | randomBytes[1] << 16 | randomBytes[2] << 8 | randomBytes[3]; // Now, this is real randomization. return new Random(seed); } } }