基于彩虹表的暴力破解的实际限制是什么?

信息安全 密码学 密码 哈希 蛮力
2021-08-29 07:45:54

假设我们有一个密码哈希。密码可以认为是由完全随机的字符组成,长度固定为 N。哈希为 SHA1(password+salt),其中 salt 的长度为 M。

为了抵抗基于彩虹表的暴力攻击,M+N 必须有多大?

  • 场景#1:考虑攻击者可以访问最先进的计算资源和存储空间,例如政府。

  • 场景 #2:考虑攻击者拥有更多有限的资源(如果我们想更具体一点,则为 1 万美元)用于设备或基于云的服务。

相关问题:如果攻击者知道总长度(M+N),复杂度会降低多少?

4个回答

假设他们随机选择字母数字(A-Za-z0-9 无符号)作为盐和密码;例如,样本空间是 (62)^M 个可能的盐和 (62)^N 个密码。

假设他们在一个农场中有 100 万个 GPU 可供使用,每个 GPU 每秒可以生成十亿个哈希(假设一个简单的 MD5 或 SHA 类型的哈希——基于 bcrypt 或 PBKDF 的哈希要慢得多)。因此,对于给定的盐,他们可以在 0.2 秒(200 000 GPU 秒)内破解 8 个字符的密码,在 14 分钟(26 GPU 年)内破解 10 个字符的密码,在 37 天(100 000 GPU)内破解 12 个字符的密码-years),150 万年(1.5 万亿 GPU 年)的 16 个字符的密码。

或者另一种思考方式;一个典型的 GPU 每秒产生 10 亿个哈希值大约需要 200 W。因此,如果电费为每千瓦时 0.10 美元,而忽略启动成本,则一个 GPU 小时的成本为 0.02 美元。因此,8 个字符的密码成本约为 1 美元,10 个字符的成本为 4600 美元,12 个字符的成本为 1800 万美元,16 个字符的成本为 260 万亿美元(世界货币供应量约为 10 万亿美元)。(这忽略了购买/维护一百万个 GPU 的成本——只是电力)。

至于彩虹桌——在某些时候它必须被建造。所以你想要一个包含所有 4 个字符前缀的完整彩虹表;并且想要覆盖最多 8 个字符的所有密码(例如,总共 12 个字符的密码),这将需要 100 000 个 GPU 年(一百万个 GPU 的 37 天)并且花费大约 1800 万美元的电费。

基本上,当随机字母数字的 M+N > ~12 时,它开始变得不可行(例如,在 M+N = 16 时不可行)。

编辑:新的汇总表,其中我列出了密码长度和类型(例如,8 A-Za-z0-9 表示 8 个字符大写 + 小写 + 数字密码)。
还包括一个google 应用程序专用密码(16 个随机小写字母),但显然 google 类型的密码通常必须在线攻击(不像 GPU 场攻击的离线哈希)。

  PW Length  | # of PW | PW Entropy |       GPU-time | Electricity Cost at $0.10/kW-hr
-------------------------------------------------------------------------------------------
 8 A-Za-z0-9 | 2x10^14 | 47.6 bits  |       60 hours |                  $1
10 A-Za-z0-9 | 8x10^17 | 59.5 bits  |       26 years |              $4 600
12 A-Za-z0-9 | 3x10^21 | 71.4 bits  |   100 000 years|         $18 000 000 ($18 million)
14 A-Za-z0-9 | 1x10^25 | 83.4 bits  | 390 million yrs|     $69 000 000 000 ($69 billion)
16 A-Za-z0-9 | 5x10^28 | 95.2 bits  |1500 billion yrs|$260 000 000 000 000 ($260 trillion)
-------------------------------------------------------------------------------------------
16 a-z       | 4x10^22 | 75.2 bits  | 1.4 million yrs|        $242 000 000 ($242 million)

我提前道歉,因为这个答案不会直接回答你的问题,但我想发布它,以便人们知道你提出的问题实际上只是一个学术问题。这个问题的真正答案是:不要使用 sha1,使用bcrypt世界上的 sha1's 和 md5's 被设计为快速和快速不是散列密码的好质量。Bcrypt 旨在允许配置散列密码所需的时间量,因此您可以减慢散列过程的速度,以使用户不会注意到其中的差异,但攻击者需要更多时间来完成生成彩虹表或暴力破解密码。有关 bcrypt 以及为什么要使用它的更多信息,请参阅此问题

除了所有这些,bcrypt 还包括一个加盐方案。由于上述原因,您可以非常肯定 woliveirajr 提到的 20 字节盐在未来将是可行的。

有彩虹表,还有蛮力……这是两个截然不同的东西。

彩虹表是散列密码的大型预计算表的特例。因此,彩虹表可以“反转”散列,即恢复匹配的密码,前提是在表构建期间的某个时间点,该密码被考虑并散列。相应地,如果可以使用彩虹表找到密码,那么可以通过简单的字典攻击找到密码,其成本不会超过建表。“彩虹”并没有改变这一点;事实上,彩虹的东西实际上使表的构建成本增加了大约 1.7 倍(这是因为表的构建倾向于考虑和散列多次相同的密码,这是不可避免的)。

结果是没有彩虹表值得努力,除非它至少可以应用两次我们使用正是为了防止这种情况发生。salt 可以看作是哈希函数的一个变体,每个新的 salt 都意味着一个新的变体。一个预先计算的表只有在预先计算出的变量与要被攻击的哈希值相同的情况下才有价值。如果没有多次使用盐值,那么聪明的攻击者就不会浪费时间建立面巾纸彩虹表;他只会进行字典攻击。


我们认为攻击者知道盐。为什么 ?因为服务器知道,攻击模式是攻击者可以获得服务器数据库的转储。无论服务器知道什么,攻击者也知道。因此,在攻击散列密码时,盐长度或内容无关紧要(攻击者必须在计算中包含盐值,但没有盐长度会使他的任务更容易或更难)。

因此,我们只有密码作为防线。如果我们想知道攻击的成本是多少,那么这就是经济学,因此会产生一些复杂性。特别是,我们想知道我们是在谈论一个正在寻找一个非常有价值的密码(例如,保护即将毁灭地球的外星力量主计算机的密码)的攻击者,还是一个谋生的攻击者破解许多密码。在后一种情况下,就功耗而言,硬件成本可以忽略不计。

如果我们采用@jimbob 的估计,每秒计算 10 9哈希的硬件使用价值 200W 的功率,功率为每千瓦时 0.1 美元(请注意,功率成本包括冷却:用于计算的每一瓦特也会变成热量,必须以某种方式消散)。这给了我们每美元1.8*10 14 个哈希值。由此,我们得到以下信息:

  • 使用 10K 美元,攻击者可以尝试 1.8*10 18 个哈希值,这或多或少是 10 个字母数字字符(大写、小写和数字)的可能密码数量。

  • 使用 6837 亿美元(这是2010 年美国军费总预算),攻击者可以尝试大约 1.23*10 26个哈希值,对应于大约 14.5 个字母数字字符。让我补充一下,这个数字对应于大约一百座核电站的年产量,因此破解努力几乎不会被忽视。

结论:使用 15 个随机字母数字字符,您的密码将抵抗甚至难以置信的敌人,即使您通过使用单次 SHA-1 调用完全搞砸了散列,而不是像您应该做的那样使用具有高迭代次数的bcryptPBKDF2请注意,这仅对随机字符有效,对您在大脑隐私中可能想出的那种字符完全无效。人的大脑在随机性方面根本不擅长。

彩虹表代表了 CPU 时间和存储之间的权衡,所以理论上这个问题的答案是不可知的。这取决于您的攻击者喜欢权衡的哪一方:如果他们有大量可用的 CPU 时间,那么在遇到新的盐值时,攻击者可以开始计算一个新表,因此它实际上毫无价值(这个极端相当于攻击者能够在不使用预计算表的情况下暴力破解密钥)。如果他们有很多存储空间,那么他们可以预先计算任何值的盐值的表,但这会花费很长时间,所以越大越好。

当然,理论上行不通的东西在实践中往往效果很好。现实世界在这一点上自我注入并告诉我们,对于许多攻击者来说,存储和 CPU 时间都是有限的。盐的时间越长,攻击者就越没有资源来发动成功的攻击。接受这种关系,那么就有一个不等式为您选择的盐大小提供了上限:

使用加盐哈希所需的总资源必须少于满足应用程序其他要求所需的资源。