using System.Security.Cryptography;
using System.Text;
namespace LMS.Common.Password
{
public static class PasswordGenerator
{
private const string LowercaseChars = "abcdefghijklmnopqrstuvwxyz";
private const string UppercaseChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private const string NumberChars = "0123456789";
private const string SpecialChars = "@$!%*?.&";
private const string AllChars = LowercaseChars + UppercaseChars + NumberChars + SpecialChars;
///
/// 生成指定长度的随机密码
///
/// 密码长度
/// 随机生成的密码
public static string GeneratePassword(int length)
{
if (length < 4)
{
throw new ArgumentException("密码长度必须至少为4个字符", nameof(length));
}
// 使用加密安全的随机数生成器
using var rng = RandomNumberGenerator.Create();
// 确保密码包含至少一个小写字母、一个大写字母、一个数字和一个特殊字符
var password = new StringBuilder();
// 添加每种类型的至少一个字符
password.Append(GetRandomChar(LowercaseChars, rng));
password.Append(GetRandomChar(UppercaseChars, rng));
password.Append(GetRandomChar(NumberChars, rng));
password.Append(GetRandomChar(SpecialChars, rng));
// 添加剩余的随机字符
for (int i = 4; i < length; i++)
{
password.Append(GetRandomChar(AllChars, rng));
}
// 打乱字符顺序
return ShuffleString(password.ToString(), rng);
}
///
/// 从指定字符集中获取一个随机字符
///
private static char GetRandomChar(string chars, RandomNumberGenerator rng)
{
byte[] data = new byte[1];
rng.GetBytes(data);
return chars[data[0] % chars.Length];
}
///
/// 打乱字符串中字符的顺序
///
private static string ShuffleString(string input, RandomNumberGenerator rng)
{
char[] array = input.ToCharArray();
int n = array.Length;
while (n > 1)
{
byte[] box = new byte[1];
rng.GetBytes(box);
int k = box[0] % n;
n--;
char temp = array[n];
array[n] = array[k];
array[k] = temp;
}
return new string(array);
}
}
}