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

Temporary Password Generator for C# Project

我们正在使用以下方法创建临时密码,我想知道这是否是一个好的做法,因为随机并不是真正随机的。 除了我们应该用另一个有效字符列表生成它之外,我非常怀疑这是否足够随机:

   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 或类似的东西? 或者 "new Random" 只是需要一些盐?

我在这里问的问题更具体,因为我问的是我提供的给定代码的具体问题。我的问题不是如何生成随机临时密码,而是我提供的代码有问题以及为什么在这些方面答案和建议更好。也许我应该将其发布在 "Code Reivew" 堆栈中。但我个人并不认为它与另一个问题完全相同。

对于 Web 应用程序,我认为您可以使用 System.Web.Security.Membership.GeneratePassword(int length, int numberOfNonAlphanumericCharacters)

您需要使用 cryptographically secure pseudo random number generator (CSPRNG)。例如

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

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

CSPRNG requirements fall into two groups: first, that they pass statistical randomness tests; and secondly, that they hold up well under serious attack, even when part of their initial or running state becomes available to an attacker