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和
您使用的是modulo
它使用模数运算符,因为
使用
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之间。