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