随机密码生成器

4
我正在尝试编写一个随机密码生成器,但在早期阶段遇到了一些问题。通过下面的代码和截图,你可以看到我得到了一个非常可预测的字符串(由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。 - Sidharth Mudgal
3
@SidharthMudgal GUIDs不是随机的。 - Blorgbeard
1
可能是重复的问题:随机数生成器只生成一个随机数 - Alexei Levenkov
@Blorgbeard 对于所有实际目的而言,“一些随机性”与“随机”是相同的。假设使用真正的随机数生成器,版本4 UUID将具有120个随机位,这已经足够安全。你说得对,输入时很烦人,但这不仅仅是字符/位比的因素。(例如,Diceware密码短语被认为易于记忆和输入,但使用一个长达6个字符的完整单词来表示12位的随机性。) - millimoose
@finnw,这个项目会比使用其他密码生成器更糟糕吗?我承认在问题中这还不够详细。 - jth41
显示剩余5条评论
5个回答

5

只需将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时,它几乎都会生成相同的值。


1
很可能种子值完全相同。忽略算法细节,Random为两个不同的种子值生成的序列以48..57范围内的相同数字开头的概率约为10%。 - millimoose
System.Random 不安全,请使用 RNGCryptoServiceProvider - CodesInChaos

3
问题在于每次调用 charGen 函数都会创建一个新的 Random 对象,并且使用当前时钟作为种子进行初始化。由于它们被快速地创建,因此它们所有的种子都相同。
你应该在类级别上创建一个单独的 Random 对象(或将其传递给 charGen 函数)。

2
为什么不使用Rnd()代替Random呢?
Private Function charGen() As Char
  Return Chr(Asc("0"c) + Rnd() * 10)
End Function

那么在循环之前只需调用Randomize()即可。


0

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


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