MD5 碰撞攻击:它们与密码散列有关吗?

信息安全 密码 哈希 md5
2021-09-02 02:34:01

免责声明:这不是对 MD5 作为密码散列函数的认可。我了解并行化、GPU 以及 bcrypt 和 scrypt 等专用密码散列函数。

有了这个,当每次有人在同一个句子中提到“MD5”和“密码哈希”时,我至少有点恼火,主脑跳进来尖叫“MD5坏了!” (通常随后是使用另一种通用散列函数(如 SHA-*)的错误建议)。

但真的是这样吗?据我所知,对 MD5 的所有可行攻击都是选择前缀攻击。这些是否以任何方式适用于散列密码?

在一个相关的问题中:虽然哈希冲突是 2 n/2,但当用于密码时,这真的意味着什么,尤其是在网络上?仅仅因为您发现了冲突并不意味着您将能够在密码字段中发送它们,这通常是长度有限的并且可能不是二进制安全的。

这是否意味着为了哈希密码的目的,只有在受到原像攻击时才能真正破坏函数?而且据我所知,MD5 的原像攻击仍然是 2 123.4,这几乎是不可行的。

注意:暴力破解弱密码所需的时间远少于 2 123.4,是的,MD5 速度很快(按设计)。我不关心这些问题中的任何一个,这并不是 MD5 的错。

3个回答

碰撞攻击对密码散列没有影响,尽管可能有一些细节取决于你散列的目的。粗略地说,当我们散列密码时,我们可能想做两件事:

  • 检查密码散列到给定的存储值:这是密码验证(例如,知道是否授予对服务器的登录访问权限)。

  • 根据密码确定性地计算一个大的对称密钥:这是密钥派生(例如加密文件)。

密码验证仅适用于对原像的抵抗(找到一个值m以使h(m)匹配给定输出的难度)。但是,密钥派生需要的远不止这些。理想情况下,对于密钥派生,散列函数的行为应该尽可能接近神话中的随机预言我们已经知道基于Merkle-Damgård 构造的哈希函数,例如 MD5 或 SHA-256,不是随机预言机(因为“长度扩展攻击”);然而,我们可以在HMAC中使用这样的函数,它使用两个嵌套的哈希函数调用来精确地避免 MD 构造问题。HMAC 仅相对于哈希函数的内部属性(即内部“压缩函数”应该与 PRF 无法区分)被“证明”安全,并且我们知道在 MD5 的情况下不满足此属性,因为否则会发生冲突攻击是不可行的……

综上所述,在使用 MD5 进行密钥派生时,我们需要应用HMAC-DRBG(一种基于重复 HMAC 调用的 PRNG)等方案,内部使用 MD5。众所周知,只要散列函数很强,这种方案就很强大,虽然碰撞攻击不直接适用,但它们表明这种“强度”没有实现。因此,担保无效。目前没有人知道如何削弱 HMAC/MD5,但我们有 MD4 的例子:MD4 被彻底破坏以防碰撞(碰撞可以“立即”产生),并且有一个已知的对 HMAC/MD4 的攻击,这是相当昂贵但仍然比理论上的 2 128快得多. 对 HMAC/MD4 的攻击不利用冲突,而是建立在与设计冲突攻击的同一来源的不同路径上。因此,高度怀疑HMAC/MD5 不如 HMAC/SHA-256 强(即使截断为 128 位)。

相应地,对于密钥派生,不要使用 MD5。它不会立即被打破但它仍然在寻找麻烦。无需立即迁移使用 MD5 进行密码散列的现有系统,但对于新设计,您应该避免使用它。


强制提醒: 当然,在对密码进行哈希处理时,无论预期用途如何(密码验证或密钥派生),您都应应用可配置的慢速由于管理密码的人脑的生物学限制,密码本身就是一个弱点。盐和可配置的缓慢是应对它的方法:盐阻碍并行性(攻击者无法在多个密码实例之间共享攻击成本——例如通过彩虹表等预先计算的表),而缓慢则违背摩尔定律(计算机随着时间的推移变得更快,但人类大脑没有)。因此,您不想使用“仅 MD5”对密码进行散列,而是使用专用的密码散列函数,例如PBKDF2bcryptPBKDF2 内部使用散列函数,例如 MD5。碰巧 MD5(如 SHA-256)很好地映射了GPU的计算能力,这使得它成为这项工作的一个值得商榷的选择,而 bcrypt 可以说更好(有关详细信息,请参阅此答案)。

碰撞阻力与密码散列无关。重要的性能是第一原像抗性。针对 MD5 的唯一实际攻击是发现冲突。

因此,对基于 MD5 的密码散列没有实际攻击,它不适用于其他快速散列函数,例如 SHA-2。无论你使用 MD5 还是 SHA-2,最强的攻击就是猜测密码。

MD5坏了,因为它很容易碰撞。但是,这会转移到 x509 证书等应用程序,因为它可能会导致冲突,即更改证书中的公钥以使整个证书的 MD5 与该证书的原始文件发生冲突。

从 MD5 在密码破解方面的破坏性抗碰撞性中获得的唯一好处是找到两个与 MD5 行为相同的“密码”。如果您将这些“密码”之一限制为特定值,您将再次回到原像电阻。

正如维基百科所说:

2005 年 3 月 1 日,Arjen Lenstra、Xiaoyun Wang 和 Benne de Weger 演示了 [12] 两个具有不同公钥和相同 MD5 哈希的 X.509 证书的构造,这是一个明显的实际冲突。该构造包括两个公钥的私钥。几天后,Vlastimil Klima 描述了[13] 一种改进的算法,能够在单个笔记本电脑上在几个小时内构建 MD5 碰撞。2006 年 3 月 18 日,Klima 发布了一种算法[14],该算法可以在一分钟内找到一台笔记本电脑上的碰撞,使用一种他称之为隧道的方法。

第三段很有趣,您认为并非所有原像都适合密码字段。您在这里也可能是正确的;输入此类密码可能需要在较低级别进行,尽可能接近 MD5 计算。

你可能会说哈希函数只有在其原像抗性被破坏时才真正被破坏,但对于许多应用程序,尤其是文档签名,MD5 的破坏性抗碰撞性很重要。假设您使用 MD5 消息身份验证代码对一些关键文档进行哈希处理。对手可能能够复制形式上看起来很巧妙的书面文件,讲述一个完全不同的故事,并且仍然产生完全相同的 MD5。你可以称之为碰撞。

话虽如此,请尝试找到此密码:2c89571cdfd318509c05d1f19fe26336