我们正在使用以下方法创建临时密码,我想知道这是否是一个好习惯,因为Random不是真正随机的。 除了我们应该使用另一个有效字符列表生成它之外,我非常怀疑这是否足够随机:
public static string CreatePassword(int length)
{
const string valid = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
StringBuilder res = new StringBuilder();
Random rnd = new Random();
while (0 < length--)
{
res.Append(valid[rnd.Next(valid.Length)]);
}
return res.ToString();
}
我们是否应该添加一些其他随机性,例如进程ID或类似的东西? 或许“新随机”只需要某种盐?
我在这里提出的问题更具体,因为我询问我提供的给定代码的具体问题。我的问题不是如何生成随机临时密码,而是我提供的代码是如何有问题的,以及为什么答案和建议在这些方面更好。也许我应该把它发布在“Code Reivew”堆栈中。但我个人认为这不是另一个问题的完全重复。
答案 0 :(得分:2)
您需要使用cryptographically secure pseudo random number generator (CSPRNG)。 e.g。
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(saltValue);
使用Random
按当前时间播种。这意味着攻击者可以生成与使用此功能的用户相同的密码,如果他们知道(或猜测)生成它的时间。密码安全随机函数没有这个缺陷:
CSPRNG要求分为两组:第一,他们通过 统计随机性检验;其次,他们保持良好状态 在严重的攻击下,甚至在他们的初始或运行状态的一部分 对攻击者可用
答案 1 :(得分:1)