关于c#:批量生成随机密码

Generating random password in bulk

我使用此源代码生成随机密码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public string GetRandomPasswordUsingGUID(int length)
{
    // Get the GUID
    string guidResult = System.Guid.NewGuid().ToString();

    // Remove the hyphens
    guidResult = guidResult.Replace("-", string.Empty);

    // Make sure length is valid
    if (length <= 0 || length > guidResult.Length)
        throw new ArgumentException("Length must be between 1 and" + guidResult.Length);

    // Return the first length bytes
    return guidResult.Substring(0, length).ToUpper();
}

当您调用该方法时,它工作得很好,但不在"for"循环语句中。

在这种情况下,它会生成一些重复的密码,这是错误的。

例如:

1
2
3
4
5
6
7
8
9
10
A4MNB597D7
AMGJCCC902
AWJ80CF6HX
A78EDJECIW
A78EDJECIW
A78EDJECIW
A78EDJECIW
A78EDJECIW
A2LYJCH23N
A2LYJCH23N

如何在"for"循环语句中创建随机密码?


guid不是随机的,它们只是唯一的(在单个系统中)。即使是一个随机数生成器也有其限制,它将返回的最小值和最大值,真正的随机意味着你可以一次又一次地得到相同的结果,你就是说不出来。

你确定你的意思是随机的,而不是强的?

XKCDhttp://xkcd.com/221/

好吧,现在我们知道你想要500-1000个唯一密码。我会质疑唯一性的必要性,因为我假设它们是为一个用户帐户,然而…(输入时没有使用vs handy)

1
2
3
4
5
6
7
8
9
10
List<string> passwords = new List<string>();

while (passwords.Length < 1000)
{
    string generated = System.Web.Security.Membership.GeneratePassword(
                           10, // maximum length
                           3)  // number of non-ASCII characters.
    if (!passwords.Contains(generated))
        passwords.Add(generated);
}

然后您将得到一个1000个唯一密码的列表,最多10个字符,3个非ASCII字符。


这不是问题的具体答案,但这就是您的guid解决方案无法工作的原因:

http://blogs.msdn.com/b/oldnewthing/archive/2008/06/27/8659071.aspx


如果您要在build中生成随机密码,我强烈建议不要使用"newguid()",因为基于用于创建UUID段的生成算法,这些段的时间戳是唯一的~100毫秒。

看:

http://en.wikipedia.org/wiki/universally_unique_标识符

最好创建一个允许字符的查找表,使用静态"随机"对象,并根据生成的随机数将字符索引到表中。


您可以使用ASP.NET的成员类,该类内置密码生成器。它在system.web.security命名空间的system.web dll中。

1
2
// Generate a new 12-character password with 1 non-alphanumeric character.
  string password = Membership.GeneratePassword(12, 1);

有关msdn:membership.generatepassword方法的详细信息,请参阅


具有讽刺意味的是,如果使用guid的最后一个字符而不是第一个字符,那么结果会更好。

要回答您的问题,这样做就足够了:

1
2
3
4
5
6
7
8
9
10
11
12
private static Random rng=new Random();
private static string PasswordAlphabet="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

public string GetRandomPasswordUsingGUID(int length)
{
  string result="";

  while(length-->0)
    result+=PasswordAlphabet[rng.Next(PasswordAlphabet.Length)];

  return result;
}