【问题标题】:Generating random password in bulk批量生成随机密码
【发布时间】:2011-09-05 18:08:57
【问题描述】:

我使用这个源代码来生成随机密码:

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”循环语句中创建随机密码?

【问题讨论】:

  • 您需要阅读有关 GUID 的文档。它们在这里不适合您的需求。
  • 你是对的!这不是生成密码的好习惯,Maye 最好说它为 500 人创建了一些票,这没什么大不了的,请专注于我的问题,而不是我要做的事情。
  • 您可能会发现this similar question 的答案很有用。
  • 那么你需要告诉我们你要做什么。您需要唯一的密码吗?随机密码?新的强密码?
  • @blowdart : 我要创建 500 到 1000 个计数的唯一字符串

标签: c# asp.net random passwords


【解决方案1】:

GUID 不是随机的,它们只是唯一的(在单个系统中)。即使是随机数生成器也有限制,它会返回的最小值和最大值,而真正随机意味着你可以一遍又一遍地得到相同的结果,只是你无法判断。

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

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&lt;string&gt; 而不是 List&lt;string&gt; 并删除 .Contains 检查,因为 Hashset.Add 可以更快地找到重复项。
  • 现在,我已经编写软件 12 年了,其中 11 年是在 .NET 中编写的,我确实对 .NET 框架有深入的了解,并且对做任何事情都感到很自在。但是让我告诉你,你每天都会学到一些新东西。你们这些一直在编程并认为自己无所不知的孩子——记住这篇文章。 我不知道 .NET 框架有一个内置的随机密码生成器!
【解决方案2】:

这不是具体问题的答案,但这就是您的 GUID 解决方案不起作用的原因:

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

【讨论】:

  • 总结该文章的相关内容:GUID 的任意子字符串可能不是唯一的
【解决方案3】:

如果您要在构建中生成随机密码,我强烈建议不要使用“NewGuid()”,因为基于生成算法,用于创建它们的 UUID 段是基于一个唯一的 ~100 毫秒时间戳。

看看:

http://en.wikipedia.org/wiki/Universally_unique_identifier

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

【讨论】:

    【解决方案4】:

    具有讽刺意味的是,如果您使用 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;
    }
    

    【讨论】:

    • 因为这是在安全敏感的上下文中使用的,你应该使用加密伪随机生成器来代替...... RNGCryptoServiceProvider
    • 耸耸肩,如果他愿意的话。考虑到他一直在使用的东西,我认为该算法对他更有用。
    • 是的,但是有人正在寻找一种创建密码的方法并偶然发现了这个问题,他们可能想要创建强密码,而不仅仅是随机密码......
    【解决方案5】:

    您可以使用 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 Method

    【讨论】:

      猜你喜欢
      • 2011-04-18
      • 2010-09-08
      • 1970-01-01
      • 2012-11-06
      • 2018-10-01
      • 2015-04-13
      • 2012-07-28
      相关资源
      最近更新 更多