这个C#asp.net随机密码代码如何工作?

How does this C# asp.net random password code work?

我不熟悉.NET和C,我想弄清楚这段代码是如何工作的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static string CreateRandomPassword(int PasswordLength)
{
  String _allowedChars ="abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ23456789";
  Byte[] randomBytes = new Byte[PasswordLength];
  RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
  rng.GetBytes(randomBytes);
  char[] chars = new char[PasswordLength];
  int allowedCharCount = _allowedChars.Length;

  for(int i = 0;i<PasswordLength;i++)
  {
      ///
      /// I don't understand how this line works:
      ///
      chars[i] = _allowedChars[(int)randomBytes[i] % allowedCharCount];
  }

  return new string(chars);
}

我想我对大部分事情都有很好的把握。我不明白下面这句话:

1
chars[i] = _allowedChars[(int)randomBytes[i] % allowedCharCount];

我理解代码生成随机二进制数,并使用for循环中的随机数从_allowedchars字符串中选择一个字符。我不明白的是,为什么这段代码使用modulous运算符(%)来获取_allowedchars索引值。

谢谢你的帮助


这只是一个旁注,但代码被巧妙地破坏了。用于选择要选取的字符的模数运算符(%)不一致:它将比其他字符更喜欢某些字符(那些靠近数组前面的字符),这意味着密码不是真正随机的。攻击者可以首先使用它来尝试更高概率的密码,并显著减少完成破解所需的时间。


randombytes[i]的值可以是0到255之间的任何整数。ou allowedchars数组的长度小于255。modules运算符返回第一个参数((int)randombytes[i])除以第二个参数(allowedCharCount)的余数。这样可以确保我们为allowedChars数组编制索引的值(modulo运算符的结果)始终小于allowedCharacterCount。


使用mod可以确保数字在0和allowedCharCount之间,从而防止索引超出范围异常。如果没有它,您将不得不限制随机生成的数字的范围,这在加密提供程序中是不可能的。它还意味着您可以在不中断代码的情况下更改字符串中允许的字符列表。


您使用的是modulo allowedCharCount,这可以确保生成的数字介于0和allowedCharCount之间,从而不会引发IndexOutOfRange异常。


它使用模数运算符,因为randomBytes[i]可以保存一个大于_allowedChars数组长度的值。

使用% allowedCharCount可以确保_allowedChars中的索引始终在范围内。否则,代码就有可能在该行上引发异常。


1
2
3
4
5
2%5=3
4%5=1
6%5=1
15%5=0
16%5=1

这保证了0-5之间的任何结果。如果您用任何其他数字(n)替换5,您将有一个类似的保证,结果将在0-n之间。