批量生成随机密码

4

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

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”循环语句中却不能。

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

例如:

A4MNB597D7
AMGJCCC902
AWJ80CF6HX
A78EDJECIW
A78EDJECIW
A78EDJECIW
A78EDJECIW
A78EDJECIW
A2LYJCH23N
A2LYJCH23N

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


3
您需要阅读GUID文档。它们在此处不适合您的需求。 - asawyer
你们都是对的!生成密码不是一个好的做法,也许更好的做法是为500个人创建一些票据。这里并不是什么大问题,请专注于我的问题,而不是我将要做的事情。 - Mostafa
你可能会发现这个类似的问题的答案很有用。 - Dan J
那么你需要告诉我们你要做什么。你需要独特的密码吗?随机密码?新的强密码? - blowdart
那实际上是什么意思?500到1000是什么? - blowdart
显示剩余3条评论
5个回答

7
GUID不是随机的,它们只是唯一的(在单个系统内)。即使是随机数生成器也有其限制,即它将返回的最小和最大值,并且真正的随机意味着你可能会一遍又一遍地得到相同的结果,只是你无法判断。
您确定您所说的是随机而不是强?

XKCD http://xkcd.com/221/

好的,现在我们大致了解了您想要500-1000个独特密码的需求。我会对独特性的必要性提出质疑,因为我认为它们应该是用于用户账户,然而...(没有方便的VS输入)

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字符。

一个小的性能改进建议 - 使用 Hashset<string> 代替 List<string> 并且去掉 .Contains 检查,因为 Hashset.Add 更快地找到重复项。 - Keith
现在,我已经写软件12年了,其中11年是在.NET上,我对.NET框架有很强的理解,并且感觉可以做任何事情。但是让我告诉你一些事情,你每天都会学到新东西。那些一直在编程并认为自己什么都知道的年轻人们 - 记住这篇文章。我不知道.NET框架有一个内置的随机密码生成器! - Mike Perrenoud

3

总结该文章的相关部分:GUID的任意子字符串可能不是唯一的。 - Dan J

2
如果您要在构建过程中生成随机密码,我强烈建议不要使用"NewGuid()",因为基于创建UUID的生成算法,它们的部分段是基于唯一的~100ms时间戳的。请参阅:http://en.wikipedia.org/wiki/Universally_unique_identifier 您最好创建一个允许字符的查找表,并使用静态的“Random”对象,根据生成的随机数索引表中的字符。

1

具有讽刺意味的是,如果您使用 GUID 的 最后 字符而不是第一个字符,则会获得更好的结果。

回答您的问题,可以这样做:

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;
}

5
由于该内容用于安全敏感的环境中,建议使用密码学伪随机生成器代替...RNGCryptoServiceProvider。 - DarkSquirrel42
如果他想的话,可以使用 耸肩。考虑到他一直在使用什么,我认为算法对他更有用。 - Blindy
没错,但是如果有人正在寻找创建密码的方法并偶然发现这个,他可能想要创建强密码,而不仅仅是随机的。 - DarkSquirrel42

1
您可以使用Asp.net的Membership类,其中内置了密码生成器。它位于System.Web dll中的System.Web.Security命名空间中。
// Generate a new 12-character password with 1 non-alphanumeric character.
  string password = Membership.GeneratePassword(12, 1);

有关MSDN:Membership.GeneratePassword方法的更多详细信息,请参见此处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接