C# 这个C asp.net随机密码代码是如何工作的?
我是.NET和C的新手,我正试图弄明白这段代码是如何工作的:C# 这个C asp.net随机密码代码是如何工作的?,c#,asp.net,random,C#,Asp.net,Random,我是.NET和C的新手,我正试图弄明白这段代码是如何工作的: public static string CreateRandomPassword(int PasswordLength) { String _allowedChars = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ23456789"; Byte[] randomBytes = new Byte[PasswordLength]; RNGCryptoServiceP
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);
}
我知道代码生成随机二进制数,并在for循环中使用这些随机数从_allowedChars字符串中选择一个字符。我不明白为什么这段代码使用模运算符%来获取_allowedChars索引值
感谢您的帮助它使用了模运算符,因为randomBytes[i]可以保存大于_allowedChars数组长度的值
通过使用%allowedCharCount,它确保到_allowedChars的索引始终在范围内。否则,代码可能会在该行引发异常。它使用模运算符,因为randomBytes[i]可能包含大于_allowedChars数组长度的值
通过使用%allowedCharCount,它确保到_allowedChars的索引始终在范围内。否则代码可能会在该行引发异常。您使用的是modulo allowedCharCount,这确保生成的数字介于0和allowedCharCount之间,以便不会引发IndexOutfrance异常。您使用的是modulo allowedCharCount,这将确保生成的数字介于0和allowedCharCount之间,因此不会引发IndexOutfrange异常。使用mod可确保数字介于0和allowedCharCount之间-它可防止索引超出范围异常。如果没有它,您将不得不限制随机生成的数字的范围,这在加密提供程序中是不可能的。这还意味着您可以在不中断代码的情况下更改字符串中允许的字符列表。使用mod可确保数字介于0和allowedCharCount之间-它可防止索引超出范围异常。如果没有它,您将不得不限制随机生成的数字的范围,这在加密提供程序中是不可能的。这还意味着您可以在不中断代码的情况下更改字符串中允许的字符列表。随机字节[i]的值可以是0到255之间的任意整数。_allowedChars数组的长度小于255。modules运算符返回第一个参数intrandomBytes[i]除以第二个参数allowedCharCount的余数。这确保我们使用模运算符的结果为_allowedChars数组编制索引的值始终小于allowedCharacterCount。随机字节[i]的值可以是0到255之间的任何整数。_allowedChars数组的长度小于255。modules运算符返回第一个参数intrandomBytes[i]除以第二个参数allowedCharCount的余数。这确保了我们用模运算符的结果为_allowedChars数组编制索引的值始终小于allowedCharacterCount。这只是一个旁注,但代码被巧妙地破坏了。用于选择要拾取的字符的模运算符%是不一致的:它更喜欢数组前面的一些字符,这意味着密码不是真正随机的。攻击者可以使用该密码首先尝试使用概率更高的密码,并显著减少完成破解所需的时间。这只是旁注,但该代码被巧妙地破解了。用于选择要拾取的字符的模运算符%是不一致的:它更喜欢数组前面的一些字符,这意味着密码不是真正随机的。攻击者可以使用该密码首先尝试使用概率更高的密码,并显著减少完成破解所需的时间
2%5=3
4%5=1
6%5=1
15%5=0
16%5=1
这保证了0-5之间的任何结果。
如果将5替换为任何其他数字n,您将得到一个类似的保证,即结果将在0-n之间
这保证了0-5之间的任何结果。
如果将5替换为任何其他数字n,您将得到一个类似的保证,即结果将在0-n之间。Man。。。看着这些回答,我觉得自己真的很愚蠢,因为我自己没有得到它。哈哈-下次我应该在问之前多研究一下代码!我们都在那里,盯着代码看了很久,直到有人走过来指出显而易见的东西。别担心,你可以做的另一件事是把代码分成两行:int temp=intrandomBytes[i]%allowedCharCount;然后chars[i]=_允许chars[temp];。然后单步执行调试器,在每个阶段检查各种变量的值。看起来我需要了解如何单步执行调试器。:-我来自dreamweaver/classic asp世界,我正试图将公司推向.net和mvc,所以我有很多关于.net ideMan的知识要学习。。。看着这些回答,我觉得自己真的很愚蠢,因为我自己没有得到它。哈哈-下次我应该在问之前多研究一下代码!我们都在那里,盯着代码看了很久
直到有人走过来指出显而易见的事情。别担心,你可以做的另一件事是把代码分成两行:int temp=intrandomBytes[i]%allowedCharCount;然后chars[i]=_允许chars[temp];。然后单步执行调试器,在每个阶段检查各种变量的值。看起来我需要了解如何单步执行调试器。:-我来自dreamweaver/classic asp世界,我正试图将公司推向.net和mvc,因此我有很多关于.net IDEHMMM的知识要学习。。。有一个简单的解决办法吗?+1:我正要发表同样的观察结果。有可能偏颇的结果对OP来说不是问题,但如果是这样的话,为什么不使用更简单、更快的Random而不是RNGCryptoServiceProvider呢?我之所以研究这个代码结构是因为下面的文章:你们有什么可以推荐的资源吗?@Joel Coehoorn-base64 encode?很抱歉请您为我详细说明,但是,如果我使用base64,会有什么变化?别忘了,总有这样一句话:嗯。。。有一个简单的解决办法吗?+1:我正要发表同样的观察结果。有可能偏颇的结果对OP来说不是问题,但如果是这样的话,为什么不使用更简单、更快的Random而不是RNGCryptoServiceProvider呢?我之所以研究这个代码结构是因为下面的文章:你们有什么可以推荐的资源吗?@Joel Coehoorn-base64 encode?很抱歉让你为我详细解释一下,但是,如果我使用base64,会有什么变化?别忘了,总是有这样一句话:酷。。我很高兴我的解释符合你的要求。酷。。我很高兴我的解释适合你。
2%5=3
4%5=1
6%5=1
15%5=0
16%5=1