【问题标题】:Random Password Generator随机密码生成器
【发布时间】:2012-11-06 23:17:33
【问题描述】:

我正在尝试编写一个随机密码生成器。我处于早期阶段,遇到了一些问题。通过下面的代码和屏幕截图,您可以看到我得到了一个非常可预测的字符串(2 的字符串)。每次我收到一个只填充一种数字的字符串。我应该如何编辑我的代码以生成更好的密码字符串? (不只是包括数字)

private void button1_Click(object sender, EventArgs e)
{
    int characters = Convert.ToInt32(comboBox1.SelectedIndex);
    string password = "";

    for(int i = 0; i <= characters; i++)
    {
       password = password +charGen();
    }

    label2.Text = password;
}

private char charGen()
{
    Random random = new Random();
    char randomNumber = Convert.ToChar( random.Next(48, 57));
    return randomNumber;
}

}

【问题讨论】:

  • 建议不要手动创建此类函数。而是使用 c# 的内置函数,如 GUID
  • @SidharthMudgal GUID 不是随机的
  • 附带说明,我应该将 random.Next 范围限制在什么范围内,以便仅提供普遍接受的密码字符?
  • @Blorgbeard 你的意思是,“某些类型的 GUID 不是随机的”。

标签: c# winforms random passwords ascii


【解决方案1】:

只需将random 保留在类范围内即可:

Random random = new Random();

private void button1_Click(object sender, EventArgs e)
{
    int characters = Convert.ToInt32(comboBox1.SelectedIndex);
    string password = "";

    for(int i = 0; i <= characters; i++)
    {
       password = password +charGen();
    }

    label2.Text = password;
}

private char charGen()
{
    char randomNumber = Convert.ToChar( random.Next(48, 57));
    return randomNumber;
}

目前,每次调用 charGen 时,它的种子值几乎相同。

【讨论】:

  • 它可能被播种为完全相同的值。 Random 为两个不同的种子值生成的序列不太可能以 48..57 范围内的相同数字开头(约 10% 的机会,忽略算法细节)
  • System.Random 不安全,请改用RNGCryptoServiceProvider
【解决方案2】:

问题是每次调用charGen 时,您都会创建一个新的Random,它会使用当前时钟为种子初始化。由于它们的创建速度如此之快,因此它们都获得了相同的种子。

您应该在类级别创建一个 Random 对象(或将其传递给 charGen)。

【讨论】:

    【解决方案3】:

    为什么不用Rnd() 而不是Random

    Private Function charGen() As Char
      Return Chr(Asc("0"c) + Rnd() * 10)
    End Function
    

    然后在循环之前调用Randomize()

    【讨论】:

      【解决方案4】:

      【讨论】:

        【解决方案5】:

        使用 System.Web.Security.Membership.GeneratePassword(int length, int numberOfNonAlphanumericCharacters)

        【讨论】:

          猜你喜欢
          • 2014-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-08
          • 1970-01-01
          相关资源
          最近更新 更多