เพิ่มรหัสเสริมเข้าไปในคำตอบที่ยอมรับ มันปรับปรุงตามคำตอบเพียงแค่ใช้แบบสุ่มและช่วยให้ตัวเลือกรหัสผ่านบางอย่าง ฉันชอบตัวเลือกบางส่วนจากคำตอบของ KeePass แต่ไม่ต้องการรวมไฟล์ปฏิบัติการในโซลูชันของฉัน
private string RandomPassword(int length, bool includeCharacters, bool includeNumbers, bool includeUppercase, bool includeNonAlphaNumericCharacters, bool includeLookAlikes)
{
if (length < 8 || length > 128) throw new ArgumentOutOfRangeException("length");
if (!includeCharacters && !includeNumbers && !includeNonAlphaNumericCharacters) throw new ArgumentException("RandomPassword-Key arguments all false, no values would be returned");
string pw = "";
do
{
pw += System.Web.Security.Membership.GeneratePassword(128, 25);
pw = RemoveCharacters(pw, includeCharacters, includeNumbers, includeUppercase, includeNonAlphaNumericCharacters, includeLookAlikes);
} while (pw.Length < length);
return pw.Substring(0, length);
}
private string RemoveCharacters(string passwordString, bool includeCharacters, bool includeNumbers, bool includeUppercase, bool includeNonAlphaNumericCharacters, bool includeLookAlikes)
{
if (!includeCharacters)
{
var remove = new string[] { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z" };
foreach (string r in remove)
{
passwordString = passwordString.Replace(r, string.Empty);
passwordString = passwordString.Replace(r.ToUpper(), string.Empty);
}
}
if (!includeNumbers)
{
var remove = new string[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
foreach (string r in remove)
passwordString = passwordString.Replace(r, string.Empty);
}
if (!includeUppercase)
passwordString = passwordString.ToLower();
if (!includeNonAlphaNumericCharacters)
{
var remove = new string[] { "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "+", "=", "{", "}", "[", "]", "|", "\\", ":", ";", "<", ">", "/", "?", "." };
foreach (string r in remove)
passwordString = passwordString.Replace(r, string.Empty);
}
if (!includeLookAlikes)
{
var remove = new string[] { "(", ")", "0", "O", "o", "1", "i", "I", "l", "|", "!", ":", ";" };
foreach (string r in remove)
passwordString = passwordString.Replace(r, string.Empty);
}
return passwordString;
}
นี่เป็นลิงค์แรกเมื่อฉันค้นหาการสร้างรหัสผ่านแบบสุ่มและต่อไปนี้อยู่นอกขอบเขตของคำถามปัจจุบัน แต่อาจมีความสำคัญที่ต้องพิจารณา
- ขึ้นอยู่กับข้อสันนิษฐานว่า
System.Web.Security.Membership.GeneratePassword
มีความปลอดภัยด้วยการเข้ารหัสลับอย่างน้อย 20% ของอักขระที่ไม่ใช่ตัวอักษรและตัวเลข
- ไม่แน่ใจว่าการลบอักขระและสตริงที่ต่อท้ายนั้นถือว่าเป็นแนวปฏิบัติที่ดีในกรณีนี้และให้ข้อมูลที่เพียงพอ
- อาจต้องการพิจารณาการใช้งานอย่างใดอย่างหนึ่งกับSecureStringสำหรับการจัดเก็บรหัสผ่านที่ปลอดภัยในหน่วยความจำ