如何证明 .NET 类随机不适合生成密码
本文关键字:不适合 随机 密码 NET 何证明 证明 | 更新日期: 2023-09-27 18:33:05
我经常看到.NET class Random
用于密码生成。
一方面,我之前问的这个问题表明,使用class Random
生成一堆"秘密"数据会产生相当可预测的数据。另一方面,我目前正在尝试执行精确的预测,我的代码在单个内核上每天以大约 600 万次种子猜测的速度工作 - 不是很快,以该速度枚举所有可能的种子值需要将近一年的时间。
有没有一种更清晰、更快速的方法来显示使用来自class Random()
的数据生成的密码比通常预期的要弱得多?
让我这样说:选择一个足以满足您要生成的密码数量的随机数生成器。如果字母大小为 36(数字,仅大写或仅小写字母(,则仅提取 RNG 内部状态的一小部分。即使你以这种方式生成 40000 个字符,这仍然只有大约 21 位信息。您在另一个问题中的算法除了前缀外,还只生成 4 个随机字符。攻击者更容易暴力破解所有可能的密码,而不是暴力破解 RNG 状态以找出要生成的下一个密码。
实际上,使用简单的RNG生成密码时,您可以犯的最糟糕的错误是生成大量密码。如果您只按需生成它们并始终使用新种子的 RNG,攻击者将很难弄清楚种子和密码。System.Random 的默认实现将自系统启动以来经过的时间(以毫秒为单位(作为种子。祝你好运
根据我的理解,Random
类基于"伪随机算法"生成随机值,因此实际上它们并不是随机的。 它们基于数学算法的具体实现,因此结果是可预测的。
因此,如果我试图破解这个算法,对于安全漏洞,我不会,我需要知道某些信息:我知道算法是什么,它可以通过 .Net 框架公开访问,输入值是什么(种子(?
同样,你不能只是把这些输入值变幻,它们必须基于某些东西,那又怎样?
据我了解,在您的示例中,您尝试生成所有可能的种子值。就像你说的,这需要很长时间!
但是我为什么要这样做呢?最聪明的方法是尝试猜测你用什么来生成你的输入值?即你是否在利用时间?密码何时重置?此密码是何时生成的?这给了我什么值子集?您使用的数字有多大?
如果你可以在一天内测试600万颗种子,那么应用一些逻辑可以将可能的值集缩小到多少个值?如果是<600万,我可以在24小时内破解你的密码。
也就是说,如果你能让你的种子子集足够大,足够不可预知,那么这很难。所以问题来了,就像安全方面的许多事情一样,这需要多安全?没有什么是100%的!
在您的原始问题中,没有人说随机不适合生成随机密码(实际上"密码"一词不会出现在问题,答案或评论中的任何地方(。您将很难证明这一点,因为为了做到这一点,系统必须一次生成许多随机密码。此外,即使攻击者设法掌握了大量密码,他也需要以某种方式匹配用户名和密码。