5

我经常看到.NETclass Random被用于密码生成。

一方面,我之前提出的这个问题表明,使用生成一堆“秘密”数据会class Random产生相当可预测的数据。另一方面,我目前正在尝试执行准确的预测,并且我的代码在单个内核上以每天大约 600 万次种子猜测的速度工作 - 不是非常快,枚举所有可能的种子值需要将近一年的时间以这个速度。

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

4

3 回答 3

1

让我这样说:选择一个足以满足您要生成的密码数量的随机数生成器。如果字母大小为 36(数字且只有大写字母或只有小写字母),您只能提取 RNG 内部状态的一小部分。即使您以这种方式生成 40000 个字符,也仍然只有大约 21 位信息。除了前缀之外,您在另一个问题中的算法仅生成 4 个随机字符。攻击者更容易暴力破解所有可能的密码,而不是暴力破解 RNG 状态以找出要生成的下一个密码。

实际上,使用简单的 RNG 生成密码时,您可能会犯的最严重的错误是生成大量密码。如果你只按需生成它们并且总是使用新种子的 RNG,那么攻击者将很难找出种子和密码。System.Random 的默认实现将系统启动后经过的时间(以毫秒为单位)作为种子。祝你好运。

于 2012-05-18T19:27:09.507 回答
0

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

因此,如果我试图破解这个算法,出于安全漏洞,而不是我愿意,我需要知道某些信息:我知道算法是什么,它可以通过 .Net 框架公开访问,输入值是什么(种子)?

同样,您不能只是想出这些输入值,它们必须基于某些东西,那又如何?

在您的示例中,据我所知,您尝试生成所有可能的种子值。就像你说的那样需要很长时间!

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

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

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

于 2012-05-03T09:08:44.973 回答
0

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

于 2012-05-03T09:11:02.267 回答