RAR密码,为什么彩虹表不起作用?

6
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我一直在寻找加密,看到了几种彩虹表攻击密码(比如Windows)的实现,都非常成功。

但我还没有看到过对RAR文件进行彩虹攻击的实现。这是为什么呢?是什么使得RAR加密更安全、免受这些攻击?


2
因为“哈希”不等于“加密”。 - NullUserException
4个回答

16

彩虹表是一种用于反向哈希函数进行优化的技术:当你只有密码的哈希值时,可以通过彩虹表找到密码。虽然这在这里不是必需的,但我建议阅读什么是彩虹表以及它们是如何使用的?,里面有一个非常好的解释,可以澄清一些常见的误解。

RAR加密(或几乎任何使用密码加密某些数据的东西)有两个部分。首先,使用密钥派生函数(KDF)从密码中派生出一个加密密钥。然后使用该加密密钥来加密或解密数据。

即使KDF是哈希函数,彩虹表也无济于事:攻击者没有KDF的输出。当密码用于身份验证时,KDF的输出存储在数据库中。当密码用于加密时,KDF的输出是秘密密钥,这就是攻击者想要的。

无论如何,彩虹表只能对未加盐的哈希有所帮助。WinRAR 使用了良好的KDFPBKDF2),其中包括一个盐。

KDF将可变长度的字符串转换为固定大小的密钥。KDF的一个关键特性是它必须将输入字符串映射到不同的密钥。密码哈希函数(SHA-1、SHA-256等)可以实现这一点。当输入字符串是人为提供的密码时,还有两个重要的属性,哈希函数本身无法实现:

  • 如果两个人选择相同的密码,他们不能最终拥有相同的密钥。
  • KDF必须计算缓慢,以便攻击者无法通过暴力破解找到密码。
一种称为盐巳达到了第一种属性。通过类似以下步骤可以达到第二种属性:取密码,追加盐,对两者进行哈希;取此哈希值,追加盐,再次哈希;重复多次。
彩虹表是计算“单向”函数的预像的优化方法:这些函数在一个方向上易于计算,但在逆向上几乎不可能,即给定x,易于计算y=f(x),但给定y,除了猜测x并检查外,没有已知的方法来找到y = f(x)对应的x。哈希函数就是这样。对称密钥加密不是这样的:攻击者无法计算f,也无法计算它的反函数。因此,彩虹表无法帮助破解对称加密。

6
彩虹表用于破解哈希函数,而不是加密。彩虹表只是某些可能输入的预计算哈希值的列表。
因此,如果你预先计算了每个可能的Windows密码的哈希值,当你想要恢复一个未知的密码时,你只需要从SAM数据库中获取哈希值,然后在彩虹表中查找。彩虹表会给你一个与该哈希值相对应的密码。这个过程受到密码盐的影响,但这就是基本思路。
彩虹表无法帮助破解加密。理论上,你可以预先计算所有可能密钥和所有可能明文输入的所有可能密文,但你可能需要更多的位来存储这些数据,而宇宙中的原子数量都不够,更不用说那些原子在你到达之前可能已经蒸发成了什么了。最快的方法(尽管仍然极其缓慢)是暴力破解密钥。

这是一个非常好的、非常详细的解释。谢谢!正是我所需要的。顺便说一句,我们中有些人确实需要睡觉! ;) 你可以查看其他用户的个人资料,看看他最后一次登录是什么时候(关于你最后的评论!)。 - Frankie
我道歉。我们往往在地球的另一端不同的时间睡觉。;-) - Andrew Cooper
如果你有一个块大小的明文crib,那么你可以使用彩虹表来破解加密。在这种情况下,该明文块的加密形式相当于“哈希” - 彩虹表理论同样适用。 - caf
@caf 在理论上,拥有明文确实有助于对加密密钥执行彩虹表攻击。问题在于密钥的大小。对于一个128位密钥,您需要近5x10^27个太字节的存储空间才能存储一个单一的明文块的彩虹表。 - Andrew Cooper
彩虹表不需要固定量的存储空间-它是一种时空权衡。每个链中只存储一个点-这就是重点,并且这也是彩虹表与详尽字典的区别所在。但是,是的,在128位熵密钥下,它仍然无法实现-因此从随机源生成的密钥是安全的。由密码/口令派生的密钥仍然可能容易受到攻击,这就是我所指的-RAR加密基于密码。盐对于基于密码的加密同样适用,原因也类似。 - caf

3
彩虹表可以从加密哈希函数生成的哈希值中恢复明文内容,但RAR文件使用AES加密文件数据和头信息。这是另一种不同的方法。

加密算法在这里并不重要,关键是从密码派生密钥的方式。RAR使用了一个很好的密钥派生函数,但无论如何这都与彩虹表的使用无关(请参见Andrew或我的答案)。 - Gilles 'SO- stop being evil'
@Gilles - 是的,那就是我的意思。我猜你是给了我一个踩的人,但我认为这是不应该的。请撤销你的踩。 - Bill Karwin

1

安德烈:盐并不会使哈希更难破解。由于盐以明文形式存储在哈希旁边,因此很容易将其从已破解的哈希中取出... 盐的目的是确保相同的明文仍具有不同的哈希值。例如,假设您的密码为entropy9,其哈希值为649acba24bab481f16ee49cdf0a40870。现在,如果您看到其他人的哈希值也是649acba24bab481f16ee49cdf0a40870,则立即知道他们的密码!显然,在非安全上下文中,如哈希映射等方面,这也具有影响。 - user461234
@user461234:哈希算法的意义在于它是无法破解的。计算机无法通过哈希值推算出生成它的明文。盐值以明文形式存在也没有帮助,除非你知道需要使用该盐值生成彩虹表。对于给定的哈希算法和所有可能的盐值生成彩虹表将再次成为一个宇宙末日级别的工作。 - Andrew Cooper
@user461234:以上方法的问题在于,尽管已经映射了大量字符串,但“hunter2”出现在数据库中的可能性要比“hunter2xAoE”高得多。 - Christian Mann
@user461234:这是错误的。MD5还没有完全映射:假设“映射”是指为每个哈希找到一个逆向的过程,那将需要大约2^128*16字节的存储空间(50亿亿亿太字节)。你不能“剔除已破解哈希的那部分”:密码哈希函数设计成,知道哈希(密码+盐)并不能帮助你更容易地找到哈希(密码)。MD5等哈希表中包含人类可读的密码,例如10^15个与彩虹表相关的密码。如果你添加64位的盐(相对较低),则表的大小会增加10^18倍。 - Gilles 'SO- stop being evil'
加密算法在这里并不重要,重要的是从密码中派生密钥的方式。RAR使用了一个很好的密钥派生函数,但这与彩虹表的使用无关(请参见Andrew或我的答案)。 - Gilles 'SO- stop being evil'
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接