【问题标题】:RAR passwords, why don't rainbow tables work? [closed]RAR 密码,为什么彩虹表不起作用? [关闭]
【发布时间】:2010-09-29 00:20:01
【问题描述】:

我一直是looking around for encryption,我已经看到彩虹表的几个实现在密码(比如windows)上工作得很好。

我还没有看到对 RAR 文件实施 Rainbow 攻击。为什么会这样。是什么让 RAR 加密更安全且不受此类攻击的影响?

【问题讨论】:

  • 因为Hashing != Encryption

标签: encryption passwords rainbowtable


【解决方案1】:

彩虹表是对反转散列函数的优化:当你只有它的散列时找到密码。虽然这不是绝对必要的,但我建议阅读What are rainbow tables and how are they used?,它有一个很好的解释,可以消除一些常见的误解。

RAR 加密有两个部分(或者几乎任何使用密码来加密某些数据的东西)。首先,使用key derivation function (KDF) 从密码派生加密密钥。然后使用加密密钥对数据进行加密或解密。

即使 KDF 是一个散列函数,彩虹表也无济于事:攻击者没有 KDF 的输出。当使用密码进行身份验证时,KDF 的输出就是存储在数据库中的内容。当使用密码进行加密时,KDF 的输出是攻击者所要获取的密钥。

无论如何,rainbow tables only help against unsalted hashes。 WinRAR uses a good KDF (PBKDF2) 包括盐。

KDF 将可变长度的字符串转换为固定大小的密钥。 KDF 的一个关键属性是它必须将输入字符串不同地映射到不同的键。 cryptographic hash function (SHA-1, SHA-256, ...) 实现了这一点。当输入字符串是人工提供的密码时,散列函数本身无法实现的其他两个重要属性:

  • 如果两个人选择相同的密码,他们最终不能拥有相同的密钥。
  • KDF 的计算速度必须很慢,以使攻击者无法通过暴力破解找到密码。

盐实现了第一个属性。第二个属性是通过执行以下操作来实现的:获取密码,附加盐,散列批次;取这个散列,附加盐,散列很多;重复多次。

彩虹表是一种通过“单向”函数计算原像的优化:在一个方向上易于计算但几乎不可能逆向计算的函数,即给定 x 很容易计算 y=f(x)但是给定 y,除了以某种方式猜测 x 并检查之外,没有已知的方法可以找到 x 使得 y=f(x)。哈希函数是这样的。使用对称密钥的加密不是这样的:攻击者不能计算 f ,就像他不能计算它的倒数一样。因此,彩虹表无法帮助破解对称加密。

【讨论】:

    【解决方案2】:

    彩虹表用于解码哈希,而不是加密。彩虹表只是一组可能输入的预计算哈希列表。

    因此,如果您预先计算每个可能的 Windows 密码的哈希值,当您想要恢复未知密码时,您所需要的只是来自 SAM 数据库的哈希值,然后在彩虹表中查找它。然后彩虹表会为您提供与该哈希相对应的密码。这被密码盐复杂化了,但这是基本思想。

    Rainbow 表无助于破解加密。从理论上讲,您可以为所有可能的密钥和所有可能的纯文本输入预先计算所有可能的密文,但是您可能需要比宇宙中的原子更多的位来存储这些数据,更不用说这些原子会在你到达那里之前可能已经沸腾了。暴力破解密钥会更快(尽管仍然非常慢)。

    【讨论】:

    • 这是一个非常好的非常详细的解释。谢谢!正是我想要的。顺便说一句,我们中的一些人确实需要睡觉! ;) 您可以查看其他用户的个人资料,看看他有多久没有签到(关于您的上一条评论!)。
    • 我很抱歉。我们倾向于在地球的另一边在不同的时间睡觉。 ;-)
    • 如果你有一个块的明文婴儿床,那么你可以使用彩虹表来对抗加密。在这种情况下,该明文块的加密形式相当于“哈希”——彩虹表理论同样适用。
    • @caf 理论上,拥有明文确实有助于对加密密钥执行彩虹表攻击。问题是密钥的大小。对于 128 位密钥,您将需要近 5x10^27 TB 的存储空间来存储单个明文块的彩虹表。
    • 彩虹表不占用固定的存储量 - 这是空间/时间的权衡。每条链中只存储一个点——这就是点,也是彩虹表与详尽字典的区别所在。但是,是的,对于具有 128 位熵的密钥仍然不可行 - 因此从随机源生成的密钥是安全的。从密码/密码短语派生的密钥仍然容易受到影响,这就是我所指的 - RAR 加密基于密码。出于相同的原因,盐同样适用于基于密码的加密。
    【解决方案3】:

    Rainbow 表有助于从加密哈希函数生成的哈希中恢复纯文本内容,但 RAR 文件对文件数据和标题使用 AES 加密。这是一种不同的动物。

    【讨论】:

    • 加密算法在这里无关紧要,重要的是从密码中导出密钥的方式。 RAR uses a good key derivation function,但这与彩虹表的使用无关(见安德鲁或我的回答)。
    • @Gilles - 是的,这就是我的观点。我猜你是给我投反对票的人,我认为这是不应该的。请推翻您的反对意见。
    【解决方案4】:

    为散列密码击败彩虹表的一种简单方法是使用salt。我不熟悉 RAR 文件中的加密,但 the Wikipedia page 说 RAR3 使用 badass encryption scheme

    【讨论】:

    • Andre:盐不会让哈希更难破解。由于盐以明文形式存储在散列旁边,因此很容易从破解的散列中取出那部分.​​.....盐的目的是确保相同的明文仍然具有不同的散列。例如,假设您的密码是 entropy9,它的哈希是 649acba24bab481f16ee49cdf0a40870。现在如果你看到别人的哈希也是649acba24bab481f16ee49cdf0a40870,那么你马上就知道他们的密码了!显然,这在非安全上下文中也有影响,例如哈希图等。
    • @user461234:哈希算法的关键在于它不能被破解。获取哈希并计算出生成它的纯文本在计算上是不可行的。以纯文本形式添加盐并没有帮助,除非您知道您需要使用该盐生成的彩虹表。为给定的哈希算法和所有可能的盐生成彩虹表将再次成为世界末日的工作。
    • @user461234:我希望看到您删除来自盐的哈希部分。这就像从你混合的水中去除混凝土的一部分。
    • @user461234:你们两个对这个问题有根本的误解。例如,md5 已被完全映射 - 有广泛的公共表可以立即告诉您给定哈希的源明文。盐对你有帮助吗?假设您的密码是“hunter2”,盐是“xAoE”。然后,当您查找哈希时,您将获得“hunter2xAoE”,并且可以轻松地将盐与哈希的其余部分分开。想想看,在散列文本中添加额外的文本显然不能扩大散列空间。它的唯一用途是在多个用户使用相同密码时掩盖事物。
    • @user461234:上述方法的问题在于,尽管 映射了大量字符串,但“hunter2”出现在数据库中的可能性远大于“hunter2xAoE”出现在数据库中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多