MD5 碰撞攻击到底有多严重

工具相关 ·

2004 年之前,MD5 在业界的地位接近现在的 SHA-256:证书用它签名,软件用它标识版本,很多系统用它做完整性校验。然后一切开始变化。理解这段历史,比记住「MD5 不安全」这句话更有价值,因为它能帮你判断一个算法在什么场景下还能用。

从理论缺陷到实际碰撞

1996 年,研究人员就发现 MD5 的压缩函数存在设计缺陷,虽然当时还构造不出实际碰撞,但已经足以让人怀疑它的长期可靠性。

2004 年,王小云团队公布了一套可实用化的碰撞构造方法,能在普通算力下找出两个不同的输入,使它们的 MD5 值相同。这是分水岭——碰撞从「理论可能」变成了「工程可行」。

2008 年,研究人员进一步展示了后果:他们用普通笔记本集群,伪造出一张带有合法 MD5 签名的 CA 证书。这意味着攻击者可以让一个恶意网站持有看起来由受信任机构签发的证书,浏览器会认为它是安全的。这一事件直接推动了证书体系放弃 MD5。

碰撞和「反推原文」是两回事

这里需要区分两个经常被混为一谈的概念。

原像攻击是指给定一个摘要,找出它的原文。MD5 在这方面仍然很困难,没有公开的实用方法。所以「MD5 解密」网站并不是在做原像攻击,它们查的是预先算好的常见口令表。

碰撞攻击是指找出两个不同的输入,使它们的摘要相同。MD5 在这方面已经被彻底攻破。

碰撞为什么危险?因为它破坏的正是「摘要可以唯一标识内容」这个前提。如果两个内容不同的文件拥有相同的 MD5,那么用 MD5 来校验内容是否被篡改就失去了意义——攻击者可以准备一个正常文件和一个恶意文件,让它们哈希相同,先用正常文件通过校验,再替换成恶意文件。

哪些场景是「对抗性」的

判断一个哈希算法能不能用,关键看场景里有没有一个主动的攻击者。

对抗性场景包括:数字签名、代码签名、证书、软件发布校验、任何需要防篡改的完整性校验。这些场景里有人有动机也有能力构造碰撞,MD5 和 SHA-1 都不能用。

非对抗性场景包括:校验下载的文件有没有传输损坏、判断两份数据是否相同、为缓存生成键、日志去重指纹。这些场景里的「不同」来自网络抖动、磁盘错误或者正常的业务差异,没有人刻意构造碰撞。此时 MD5 的速度和广泛的兼容性反而是优点。

这两类场景的界线就是「有没有对手」。同一个算法,在一个场景里是致命缺陷,在另一个场景里是完全合理的工具。

已经用了 MD5 该怎么办

如果系统里用了 MD5 做签名或完整性校验,需要按场景处理。

用于口令存储的,必须换成 Bcrypt、Argon2 或 PBKDF2。这是优先级最高的一类,因为口令泄露的影响最直接。迁移可以在用户登录时顺带完成。

用于文件分发校验的,如果只是让用户确认下载没坏,MD5 还能用;但如果这个校验承担了「防篡改」的职责,就必须换成 SHA-256。更好的做法是同时发布 SHA-256 值,并让它从 HTTPS 页面或签名发布说明中获取。

用于接口签名的,需要检查签名方案的设计。如果只是用 MD5 做一次拼接摘要,风险较高;如果使用了 HMAC 结构,情况会好一些,但新系统仍建议直接上 HMAC-SHA256。

检查清单

  • 2004 年的碰撞构造方法与 2008 年的伪造证书事件,是 MD5 退出安全场景的两个关键节点
  • 碰撞攻击破坏的是「摘要唯一标识内容」,与原像攻击是两回事
  • 判断能否使用看有没有主动攻击者:对抗性场景一律不用 MD5
  • 非对抗性的传输校验、去重、缓存键,MD5 仍可合理使用
  • 口令存储必须换成慢哈希,这是优先级最高的一项
  • 涉及防篡改的校验改用 SHA-256,并从可信渠道获取对照值
阅读 11