我已经进行了常规的谷歌搜索,我认为在.NET Framework中没有随机密码生成器是正确的。这是为了重置AD中忘记密码的用户。
这肯定会成为渗透测试的下一阶段的问题。我想避免回答“哦,是啊,我只是做了自己的生成器”。
有什么建议吗?我肯定不能依赖.NET Random类和字符数组。
谢谢。
我已经进行了常规的谷歌搜索,我认为在.NET Framework中没有随机密码生成器是正确的。这是为了重置AD中忘记密码的用户。
这肯定会成为渗透测试的下一阶段的问题。我想避免回答“哦,是啊,我只是做了自己的生成器”。
有什么建议吗?我肯定不能依赖.NET Random类和字符数组。
谢谢。
虽然不应该依赖于Random
来处理任何与安全相关的事情,但使用RNGCryptoServiceProvider
生成所需的随机数据以构建新密码是可以的。
此外,在BCL中实际上有一种生成随机密码的方法,但它被隐藏在System.Web
程序集中。静态方法Membership.GeneratePassword
可以生成指定长度的密码。
GeneratePassword方法用于生成随机密码,通常由成员资格提供程序实现的ResetPassword方法使用,以将用户的密码重置为一个新的临时密码。
生成的密码仅包含字母数字字符和以下标点符号:!@#$%^&*()_-+=[{]};:<>|./?. 不包括隐藏或不可打印的控制字符在生成的密码中。
文档似乎没有包含有关创建密码的信息,但是源代码可供查看。
这里有一个生成易记密码的函数。可以用于重置密码或创建初始密码,而不是要求用户在注册时输入密码。
// Creates fairly easy-to-remember random passwords, consisting of
// three syllables (consonnant + vowel) and two digits at the end.
// A total of 172'800'000 combinations is possible.
public static string GeneratePassword()
{
const string consonnants = "bcdfghjklmnpqrstvwxz";
const string vowels = "aeiouy";
string password = "";
byte[] bytes = new byte[4];
var rnd = new RNGCryptoServiceProvider();
for (int i=0; i<3; i++)
{
rnd.GetNonZeroBytes(bytes);
password += consonnants[bytes[0]*bytes[1] % consonnants.Length];
password += vowels [bytes[2]*bytes[3] % vowels.Length];
}
rnd.GetBytes(bytes);
password += (bytes[0] % 10).ToString() + (bytes[1] % 10).ToString();
return password;
}
bavara11
baqovi84
namana07
cyluha55
vobana18
qanabi05
bukinu09
gapupa29
顺便说一句,这些密码可能不是世界上最安全的,但我敢打赌,它们比人们在互联网上使用的平均密码要强得多。