哈希碰撞是什么,为什么危险
← 返回博客
哈希碰撞是什么,为什么危险
· 6 分钟阅读
哈希碰撞的定义
哈希碰撞(Hash Collision)是指两个不同的输入经过哈希函数计算后,产生了完全相同的输出(哈希值)。由于哈希函数将无限多的可能输入映射到有限的输出空间,数学上碰撞必然存在(鸽巢原理)。安全哈希函数的设计目标是让碰撞在现实中极难被找到和利用。
/* A collision means: */
hash(input_A) == hash(input_B)
/* But: */
input_A != input_B
/* Example (conceptual - not actual MD5): */
MD5(data_A) = "d41d8cd98f00b204e9800998ecf8427e"
MD5(data_B) = "d41d8cd98f00b204e9800998ecf8427e"
/* data_A and data_B are different files! */
三种不同类型的碰撞攻击
- **碰撞攻击(Collision Attack):**找到任意两个不同输入,使其产生相同的哈希值。攻击者可以自由选择两个输入,只需要它们哈希相同。MD5 和 SHA1 已被发现实际的碰撞攻击。
- **预像攻击(Preimage Attack):**给定一个哈希值,找到任意一个产生该哈希值的输入。比碰撞攻击更难,对 SHA256 等现代哈希函数仍然不可行。
- **二次预像攻击(Second Preimage Attack):**给定一个特定输入,找到另一个不同的输入,使两者具有相同的哈希值。介于上述两种之间的难度。
MD5 碰撞:真实案例
2004 年,王小云等研究者发表了实际的 MD5 碰撞算法。2008 年,Marc Stevens 等人利用 MD5 碰撞成功伪造了有效的 SSL/TLS 证书。攻击方式:研究者使用了允许碰撞的 MD5 弱点,生成了两份具有相同 MD5 哈希的证书签名请求——一份是合法的,另一份包含恶意 CA 权限。当 CA 机构(使用 MD5 验证)为合法请求签名时,该签名也对恶意版本有效,使攻击者获得了伪造任意网站证书的能力。
SHA1 碰撞:SHAttered 攻击
2017 年,Google 和 CWI 研究所宣布了 SHAttered 攻击,这是第一次针对 SHA1 的实际碰撞攻击。他们生成了两个具有相同 SHA1 哈希值但内容不同的 PDF 文件。这两个 PDF 文件的开头字节完全相同,但内嵌的图像内容不同,肉眼可以明显区别,但 SHA1 哈希完全一致。
这次攻击使用了约 110 次量级的 SHA1 计算,等效于 6,500 CPU 年或 110 GPU 年。相比之下,一般的生日攻击(Birthday Attack)理论上需要 2 的 80 次方次计算,SHAttered 通过密码分析技巧将实际计算量降低到约 2 的 63 次方次。
哈希碰撞的危害场景
- **数字签名伪造:**如果签名系统使用碰撞易感哈希,攻击者可以用一个良性文档获得签名,然后声称该签名适用于另一份恶意内容相同哈希的文档
- **伪造 SSL 证书:**如 2008 年 MD5 证书伪造攻击所示,可以冒充任何 HTTPS 网站
- **软件包篡改:**攻击者可以将恶意程序的哈希伪造成与合法程序相同,骗过只检查 MD5 的完整性验证
如何防御哈希碰撞攻击
- 迁移到 SHA256 或更强的哈希函数(SHA-3、BLAKE2)进行所有安全操作
- 不要仅依赖哈希验证,结合数字签名(GPG/PGP)进行真实性验证
- 在证书和 TLS 配置中拒绝 MD5 和 SHA1(现代浏览器默认已拒绝)
- 在内容安全(如 CSP、SRI)中使用 SHA256 或 SHA384
哈希碰撞 vs 非密码学哈希的碰撞
在非密码学哈希表中,碰撞是正常且可接受的——当两个键哈希到同一个槽时,使用链接(Chaining)或开放寻址(Open Addressing)处理即可。哈希表碰撞不是安全问题,而是性能问题。然而,在 Web 框架中,如果攻击者可以控制大量碰撞,可能导致哈希表性能退化到 O(n),造成 DoS 攻击(HashDoS)。现代语言的内置字典/映射类型通常使用随机哈希种子来防止此类攻击。
立即尝试在线工具,无需安装,免费使用。
打开工具 →
立即免费使用相关工具
免费使用 →