【问题标题】:When is it safe to use a broken hash function?什么时候使用损坏的哈希函数是安全的?
【发布时间】:2010-05-22 19:27:49
【问题描述】:

使用像 SHA-256 这样的安全哈希函数是微不足道的,继续使用 MD5 来保证安全是鲁莽的行为。但是,我想更好地理解散列函数漏洞的一些复杂性。

冲突是generated for MD4 and MD5。根据 NIST,MD5 不是一个安全的散列函数。它只需要239 operations to generate a collision,绝不应该是used for passwords。但是 SHA-1 容易受到 similar collision attack 的攻击,其中可以在 269 操作中发现冲突,而暴力破解是 280。没有人产生 SHA-1 冲突和NIST still lists SHA-1 as a secure message digest function

那么什么时候使用损坏的哈希函数是安全的?即使一个功能被破坏,它仍然可以“足够大”。 According to Schneier 易受碰撞攻击的哈希函数仍然可以用作HMAC。我相信这是因为 HMAC 的安全性取决于其密钥,并且在获得此密钥之前无法找到冲突。一旦你在 HMAC 中使用了密钥,它就已经被破坏了,所以这是一个有争议的问题。哪些哈希函数漏洞会破坏 HMAC 的安全性?

让我们更进一步地了解这个属性。如果在密码前加上盐,那么使用非常弱的消息摘要(如 MD4)作为密码是否会变得安全?请记住,MD4 和 MD5 攻击是前缀攻击,如果添加了盐,那么攻击者将无法控制消息的前缀。如果盐确实是一个秘密,并且不为攻击者所知,那么是否将其附加到密码中是否重要?假设攻击者在获得整个消息之前无法产生冲突是否安全?

您是否知道可以在安全上下文中使用损坏的哈希函数而不引入漏洞的其他情况?

(请发布支持证据,因为它很棒!)

【问题讨论】:

  • 关于 HMAC 的维基百科文章 - en.wikipedia.org/wiki/HMACHMAC with the full version of MD4 can be forged with this knowledge。这份文件 - eprint.iacr.org/2006/187.pdf - 解释了它背后的数学原理,但我并不完全遵循它。也许您可能对此感兴趣。

标签: security hash cryptography message-digest


【解决方案1】:

实际上,冲突比您在 MD5 和 SHA-1 上列出的内容更容易。 MD5 冲突可以在相当于 226.5 操作的时间内找到(其中一个“操作”是对短消息的 MD5 计算)。请参阅this page 了解一些详细信息和攻击的实现(我编写了该代码;它在 64 位模式下的 2.4 GHz Core2 x86 上平均 14 秒内发现冲突)。

同样,对 SHA-1 最著名的攻击是大约 261 次操作,而不是 269。它仍然是理论上的(还没有产生实际的碰撞),但它在可行的范围内。

至于对安全性的影响:散列函数通常被认为具有三个属性:

  • 没有原像:给定 y,找到 x 使得 h(x) = y 应该是不可行的。
  • 没有第二个原像:给定 x1,找到 x2 应该是不可行的(不同从 x1) 使得 h(x1) = h(x2) em>。
  • 没有冲突:找到任何 x1x2 应该是不可行的(不同于彼此)使得 h(x1) = h(x2).

对于具有 n 位输出的散列函数,在 2n 中存在通用攻击(无论散列函数的细节如何都有效) 对前两个属性进行操作,对第三个属性进行 2n/2 操作。如果对于给定的散列函数,发现攻击,通过利用散列函数如何操作的特殊细节,比相应的通用攻击更快地找到原像、第二个原像或碰撞,那么散列函数被称为被“打破”。

但是,并非所有哈希函数的使用都依赖于所有三个属性。例如,数字签名首先对要签名的数据进行哈希处理,然后在算法的其余部分使用哈希值。这依赖于对原像和第二原像的抵抗力,但数字签名本身不受碰撞的影响。在某些特定的签名场景中,冲突可能是一个问题,其中攻击者可以选择要由受害者签名的数据(基本上,攻击者计算冲突,让受害者签署一条消息,并且签名对另一条消息)。这可以通过在计算签名之前在签名消息中添加一些随机字节来抵消(攻击和解决方案在 X.509 证书的上下文中演示)。

HMAC 安全性依赖于散列函数必须满足的 other 属性;即,“压缩函数”(构建散列函数的基本块)充当伪随机函数(PRF)。关于什么是 PRF 的详细信息是相当技术性的,但粗略地说,PRF 应该与 Random Oracle 没有区别。随机预言机被建模为一个黑匣子,其中包含一个侏儒、一些骰子和一本大书。在一些输入数据上,gnome 选择一个随机输出(用骰子)并在书中写下输入消息和随机选择的输出。 gnome 使用这本书检查他是否已经看到相同的输入消息:如果是,则 gnome 返回与以前相同的输出。通过构造,在您尝试之前,您可能对给定消息上的随机预言机的输出一无所知。

随机预言机模型允许在 PRF 的调用中量化 HMAC 安全证明。基本上,证明表明如果不大量调用 PRF 就无法破坏 HMAC,而“巨大”是指计算上不可行的。

不幸的是,我们没有随机预言机,所以在实践中我们必须使用哈希函数。没有证据证明散列函数确实存在,具有 PRF 属性;目前,我们只有候选函数,即我们无法证明(还)它们的压缩函数不是 PRF 的函数。

如果压缩函数是一个PRF那么哈希函数会自动抵抗冲突。这就是 PRF 的魅力所在。 因此,如果我们可以找到哈希函数的冲突,那么我们知道内部压缩函数不是 PRF。这不会将冲突转变为对 HMAC 的攻击。能够随意产生冲突无助于破坏 HMAC。但是,这些冲突表明与 HMAC 相关的安全证明不适用。保证无效。这与笔记本电脑一样:打开机箱不一定会损坏机器,但之后您就得靠自己了。

Kim-Biryukov-Preneel-Hong 文章中,介绍了一些对 HMAC 的攻击,特别是对 HMAC-MD4 的伪造攻击。该攻击利用了 MD4 的缺点(它的“弱点”),使其成为非 PRF。具有相同弱点的变体被用于在 MD4 上产生冲突(MD4 被彻底破坏;一些攻击产生的冲突比哈希函数本身的计算更快!)。因此,冲突并不意味着 HMAC 攻击,但两种攻击都以相同的源为食。但是请注意,伪造攻击的成本是 258,这是相当高的(没有产生实际的伪造,结果仍然是理论上的)但远低于抵抗力HMAC 的预期水平(具有 n 位输出的稳健散列函数,HMAC 应能抵抗高达 2n 的工作因子;n = 128 对于 MD4)。

因此,虽然冲突本身并不意味着 HMAC 的弱点,但它们是个坏消息。在实践中,碰撞对于很少的设置来说是个问题。但是要知道冲突是否会影响哈希函数的给定用法已经够棘手了,继续使用已经证明有冲突的哈希函数是非常不明智的。

对于 SHA-1,攻击仍然是理论上的,SHA-1 被广泛部署。情况是这样描述的:“警报响了,但没有可见的火或烟雾。是时候向出口走去——但不要跑。”

有关该主题的更多信息,请先阅读 Menezes、van Oorschot 和 Vanstone 撰写的 Handbook of Applied Cryptography 的第 9 章,这是密码学学徒的必读之书(不要与 B 的“应用密码学”相混淆) . Schneier,这是一个写得很好的介绍,但没有“手册”那么透彻)。

【讨论】:

  • 您以惊人的答案从字面上解决了我所有的问题。
【解决方案2】:

只有在碰撞的后果是无害的或微不足道的情况下,才可以安全使用损坏的哈希函数,例如将文件分配给文件系统上的存储桶时。

【讨论】:

  • +1 我的一些支持证据与您的陈述相矛盾,但没关系。
【解决方案3】:

当你不在乎它是否安全时。

说真的,在几乎所有语言中使用安全哈希函数都不需要任何额外的努力,而且性能影响可以忽略不计,所以我不明白你为什么不这样做。

[在实际阅读您的问题后进行编辑]

根据 Schneier 的说法,易受碰撞攻击的哈希函数仍然可以用作 HMAC。我相信这是因为 HMAC 的安全性取决于其密钥,并且在获得此密钥之前无法找到冲突。

实际上,这本质上是因为能够为哈希生成冲突并不一定有助于您为hash-of-a-hash 生成冲突(结合 HMAC 使用的 XORing)。

如果密码附加了盐,那么使用 md4 等非常弱的消息摘要作为密码是否会变得安全?

不,如果散列有 preimage attack 允许您将数据添加到输入中,则不会。例如,如果哈希是H(pass + salt),我们需要一个原像攻击,它允许我们找到pass2,这样H(pass2 + salt) = H(pass + salt)

过去曾有过追加攻击,所以我确信前置攻击是可能的。

【讨论】:

    【解决方案4】:

    下载站点使用 MD5 哈希作为校验和来确定文件在下载过程中是否损坏,我会说损坏的哈希就足够了。

    假设 MITM 决定修改文件(例如 zip 存档或 exe)。现在,攻击者必须做两件事 -

    1. 查找哈希冲突并从中创建修改后的文件
    2. 确保新创建的文件也是有效的 exe 或 zip 存档

    使用损坏的哈希,1 更容易一些。但是确保碰撞同时满足文件的其他已知属性在计算上过于昂贵。

    这完全是我自己的答案,我可能大错特错。

    【讨论】:

    • 如果您已经了解了这些哈希值是如何存储在服务器上的,那么如果您对文件共享具有写入权限,则只需更改哈希值并完成它。
    【解决方案5】:

    答案完全取决于您使用它的目的。如果你需要防止某人在几毫秒内发生碰撞,我会比如果你需要防止某人在几十年内发生碰撞那么担心。

    你真正想解决什么问题?

    【讨论】:

    • 我正在尝试解决更好地理解消息摘要函数的问题。
    【解决方案6】:

    对于使用 MD4 之类的密码作为密码的大部分担忧与当前已知的攻击无关,而与以下事实有关很可能有人将能够使用该知识来创建原像攻击——并且当/如果发生这种情况,基本上该哈希函数的所有可能用途都会变得容易受到攻击。

    【讨论】:

      猜你喜欢
      • 2016-07-11
      • 2010-10-26
      • 2015-03-05
      • 1970-01-01
      • 2015-07-01
      • 2011-05-16
      • 2010-09-07
      • 1970-01-01
      相关资源
      最近更新 更多