随机密码生成器

时间:2012-11-19 02:39:50

标签: c# winforms random passwords ascii

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

enter image description here

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

}

5 个答案:

答案 0 :(得分: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 :(得分:3)

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

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

答案 2 :(得分:2)

为什么不使用Rnd()代替Random

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

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

答案 3 :(得分:1)

答案 4 :(得分:0)

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