Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何证明.NET类Random不适合生成密码?_C#_.net_Random - Fatal编程技术网

C# 如何证明.NET类Random不适合生成密码?

C# 如何证明.NET类Random不适合生成密码?,c#,.net,random,C#,.net,Random,我经常看到.NETclassrandom用于生成密码 一方面,这表明使用classrandom生成一组“秘密”数据会产生相当可预测的数据。另一方面,我目前正在尝试执行精确的预测,我的代码在一个内核上以每天大约600万次种子猜测的速度工作——不是非常快,以这种速度枚举所有可能的种子值几乎需要一年时间 有没有更清晰、更快速的方法来证明使用class Random()中的数据生成的密码比通常预期的要弱得多?根据我的理解,Random类根据“Psuedo Random algorithm”生成随机值,因

我经常看到.NET
classrandom
用于生成密码

一方面,这表明使用
classrandom
生成一组“秘密”数据会产生相当可预测的数据。另一方面,我目前正在尝试执行精确的预测,我的代码在一个内核上以每天大约600万次种子猜测的速度工作——不是非常快,以这种速度枚举所有可能的种子值几乎需要一年时间


有没有更清晰、更快速的方法来证明使用
class Random()
中的数据生成的密码比通常预期的要弱得多?

根据我的理解,
Random
类根据“Psuedo Random algorithm”生成随机值,因此实际上它们并不是随机的。它们基于数学算法的具体实现,因此结果是可预测的

所以,如果我试图破坏这个算法,为了一个安全漏洞,而不是我会,我需要知道某些信息:我知道算法是什么,它可以通过.Net framework公开访问,输入值(种子)是什么

再说一遍,你不能只是把这些输入值变魔术,它们必须基于某种东西,那又怎样

根据我的理解,在您的示例中,您试图生成所有可能的种子值。像你说的那样需要很长时间

但我为什么要这么做?最聪明的方法是尝试并猜测您使用什么来生成输入值?i、 你在利用时间吗?密码什么时候重置?这个密码是什么时候生成的?这给了我什么样的值子集?您使用的数字有多大

如果一天可以测试600万个种子,那么应用一些逻辑将可能的值集缩小到多少?如果小于600万,我可以在24小时内破解你的密码


也就是说,如果你能让你的种子子集足够大,足够不可预测,那么这就很难了。所以问题是,就像很多安全领域的事情一样,这需要有多安全?什么都不是100%

在您最初的问题中,没有人说随机不适合生成随机密码(事实上,“密码”一词不会出现在问题、答案或评论中的任何地方)。您将很难证明这一点,因为为了做到这一点,系统必须同时生成大量随机密码。此外,即使攻击者设法获得了大量密码,也需要以某种方式匹配用户名和密码。

让我这样说:选择一个随机数生成器,该生成器适合您要生成的密码数。 字母表大小为36(数字和仅大写或小写字母),您仅提取RNG内部状态的一小部分。即使以这种方式生成40000个字符,仍然只有大约21位的信息。 您在另一个问题中的算法除了前缀外,只生成4个随机字符。攻击者可以更轻松地强制执行所有可能的密码,而不是强制执行RNG状态,以确定要生成的下一个密码


实际上,当使用简单的RNG生成密码时,您可能会犯的最大错误是生成大量密码。如果您仅根据需要生成它们,并且始终使用新种子RNG,则攻击者将很难确定种子以及密码。System.Random的默认实现将自系统启动以来经过的时间(以毫秒为单位)作为种子。祝你好运找到答案。

为什么不让他们看看埃里克·利珀特的回答和你链接的问题?它甚至展示了一个加密随机数生成的例子——如果你试图说服商业头脑,那么只要提到“加密”这个词就可以了:-我认为你的逻辑是错误的。如果有一个应用程序是安全关键的,那么提出解决方案以证明该解决方案满足安全要求的人就有责任。我怀疑有人能为.NET的随机类做这件事。加密应用程序中使用的PRNG具有定义的安全属性,因此可以显示它们满足定义的要求。但您的前三段适用于所有常用的RNG,对吗?如果我有你的算法和种子,我可以得到下一个值。没错,但复杂性是个问题。但是random只有一把钥匙?它不是很复杂,所以猜测该键所需的逻辑更简单。它不是为随机密码生成而设计的。类似MD5散列的东西是为加密而设计的,所以它更复杂,它有多个密钥,等等。所以复制结果所需的逻辑要复杂得多。如果您使用MD5处理任何与密码和/或加密有关的事情,您最好不要麻烦。我不是,这是基于安全的算法的一个示例,而随机性则不是。