← 返回博客

哈希碰撞是什么,为什么危险

2026-04-11 · 5 分钟阅读

← 返回博客

哈希碰撞是什么,为什么危险

· 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! */

三种不同类型的碰撞攻击

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 次方次。

哈希碰撞的危害场景

如何防御哈希碰撞攻击

哈希碰撞 vs 非密码学哈希的碰撞

在非密码学哈希表中,碰撞是正常且可接受的——当两个键哈希到同一个槽时,使用链接(Chaining)或开放寻址(Open Addressing)处理即可。哈希表碰撞不是安全问题,而是性能问题。然而,在 Web 框架中,如果攻击者可以控制大量碰撞,可能导致哈希表性能退化到 O(n),造成 DoS 攻击(HashDoS)。现代语言的内置字典/映射类型通常使用随机哈希种子来防止此类攻击。

立即尝试在线工具,无需安装,免费使用。

打开工具 →

立即免费使用相关工具

免费使用 →