C#项目的临时密码生成器

时间:2015-08-11 13:00:03

标签: c# passwords

我们正在使用以下方法创建临时密码,我想知道这是否是一个好习惯,因为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”堆栈中。但我个人认为这不是另一个问题的完全重复。

2 个答案:

答案 0 :(得分:2)

您需要使用cryptographically secure pseudo random number generator (CSPRNG)。 e.g。

RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(saltValue);

使用Random按当前时间播种。这意味着攻击者可以生成与使用此功能的用户相同的密码,如果他们知道(或猜测)生成它的时间。密码安全随机函数没有这个缺陷:

  

CSPRNG要求分为两组:第一,他们通过   统计随机性检验;其次,他们保持良好状态   在严重的攻击下,甚至在他们的初始或运行状态的一部分   对攻击者可用

答案 1 :(得分:1)