哈希碰撞是什么?生日悖论告诉你碰撞有多容易
23 人房间就有 50% 概率两人同生日——哈希碰撞概率同样远超直觉。讲清碰撞原理、生日攻击与为什么 128 位哈希够用。
一、什么是哈希碰撞
哈希把任意长输入映射到固定长输出,输出空间有限而输入无限——由抽屉原理,必然存在不同输入得到相同输出,这就是碰撞。碰撞不是 bug 而是数学必然,好哈希函数只是让「找到碰撞」极其困难。
二、生日悖论:概率远超直觉
一个房间多少人,就有 50% 概率两人同一天生日?答案只要 23 人。
同理,对输出 n bit 的哈希,只需约 2n/2 次尝试就有 50% 概率找到任两次输出相同:
- MD5(128 bit):264 量级——看似天文数字,但针对性攻击已把成本拉到笔记本可跑。
- SHA-256(256 bit):2128 量级,当前算力不可行。
三、碰撞攻击的类型
- 生日攻击:随机找任意碰撞,成本 2n/2。
- 针对性碰撞攻击:利用算法结构弱点构造碰撞——MD5、SHA-1 都被这样实际攻破(伪造证书的「 chosen-prefix collision」是经典演示)。
- 原像攻击:给定哈希值找原文,难度 2n,目前主流哈希都扛得住。
四、工程启示
- 安全场景远离 MD5/SHA-1:数字签名、证书、完整性校验用 SHA-256 起步。
- 哈希表/Bucket 场景:非对抗环境下 MD5 仍可用,但 SipHash 这类带密钥哈希能防 HashDoS。
- 去重判断:哈希相同≠内容相同(概率极小但存在),关键场景比对哈希后再比对长度或原文。
在线体验
不用装任何环境,直接用本站MD5/SHA 哈希工具在线操作,数据都在浏览器本地处理,方便又安全。
常见问题
两个文件 MD5 相同就一定同文件吗?
理论上不一定(碰撞存在),实际上自然产生碰撞概率约 2^-128 可忽略。但对抗场景(有人故意构造)MD5 碰撞已被实际制造,安全校验请用 SHA-256。
为什么生日攻击只要 2 的 n/2 次方?
因为比较的是「任意两两配对」而非「指定一个找另一个」:n 个对象有 n(n-1)/2 个配对机会,概率按平方根速度攀升,这就是生日悖论的威力。
SHA-256 会被碰撞攻破吗?
目前没有任何实际可行的碰撞攻击,安全余量约 128 bit。短期内不需要担心,长期看 SHA-3 是备好的备胎。
