我已经完成了常规的Google搜索,我认为我说在.NET Framework中没有随机密码生成器是正确的。目的是为忘记用户重置AD中的密码。
这在渗透测试的下一阶段肯定会成为一个问题。我想避免回答“哦,是的,我只是敲了我自己的发电机东西”。
有什么建议?当然,我不能依赖.NET Random类和一个字符数组。
干杯。
答案 0 :(得分:13)
虽然不依赖Random
来处理与安全相关的任何事情,但您可以使用RNGCryptoServiceProvider
生成构建新密码所需的随机数据
此外,实际上是 BCL中用于生成随机密码的方法,但它隐藏在System.Web
程序集中。静态方法Membership.GeneratePassword
可以生成由调用者指定的密码长度。
GeneratePassword方法用于生成随机密码,并且最常由成员资格提供程序实施的ResetPassword方法用于将用户的密码重置为新的临时密码。
生成的密码仅包含字母数字字符和以下标点符号:!@#$%^& *()_- + = [{]};:<> | ./?。生成的密码中不包含隐藏或不可打印的控制字符。
该文档似乎不包含有关如何创建密码的任何信息,但source code is available可供您查看。
答案 1 :(得分:4)
如果你真的想要真正的随机性,你应该使用RNGCryptoServiceProvider类而不是Random来完成这些任务。以下是how to create a random password in .NET的示例。
答案 2 :(得分:2)
这是一个生成简单记忆密码的功能。可能对重置密码或创建初始密码很有用,而不是要求用户在注册时键入密码。
// 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
P.S。这些可能不是世界上最安全的密码,但我敢说,这些密码比人们在互联网上使用的密码要强得多。