生日悖论与哈希安全性
一、生日悖论的基本结论
- 经典结论:在一个 23 人的班级里,至少有两人同一天生日的概率大于 50%。
- 悖论之处:365 天对应 365 种生日,看起来 23 人远小于 365,人们直觉上认为概率应该很小。但事实上,概率已经超过一半。
二、为什么会这样?直观理解
-
错误直觉 你可能会认为这是在问“某个人和我同生日”的概率,那大约是 1/365,非常低。
-
正确理解 实际上我们关心的是“任意两人”生日是否相同。
-
23 人之间可以形成的配对数是
\[C(23,2) = \frac{23 \times 22}{2} = 253\] -
每一对就是一个潜在的碰撞机会。配对数量随着人数平方级增长,远比直觉的线性增长快得多。
-
-
配对效应 随着人数增加,可能的配对数迅速上升:
| 人数 | 配对数 | 至少两人同生日的概率 |
|---|---|---|
| 10 | 45 | 12% |
| 23 | 253 | 50.7% |
| 30 | 435 | 70.6% |
| 50 | 1225 | 97% |
| 60 | 1770 | 99.4% |
三、数学推导
为了算“至少两人相同”的概率,更容易的方法是算反面事件——“所有人生日都不同”的概率:
\[P(\text{全不同}) = \frac{365}{365} \times \frac{364}{365} \times \frac{363}{365} \times \dots \times \frac{343}{365}\]23 个人时:
\[P(\text{全不同}) \approx 0.4927\]所以:
\[P(\text{至少一对相同}) = 1 - 0.4927 \approx 0.5073 \quad (50.7\%)\]四、推广到一般情况:为什么是约 √N
设有一个随机函数,它的输出空间大小为 $N$(比如一年 365 天,或者哈希函数输出空间 $2^n$)。
- 取 $k$ 个输入值,配对数大约为 $k^2/2$。
- 每对发生碰撞的概率是 $1/N$。
-
所有配对无碰撞的概率近似为:
\[P(\text{无碰撞}) \approx \left(1 - \frac{1}{N}\right)^{k^2/2} \approx e^{-k^2/(2N)}\]
要使碰撞概率达到 50%,即 $P(\text{无碰撞}) \approx 0.5$,解得:
\[k \approx \sqrt{2N \ln 2} \approx 1.177 \sqrt{N}\]结论:碰撞出现的“临界样本量”与 $\sqrt{N}$ 成正比。
五、哈希函数中的应用:生日攻击
-
哈希函数的性质
- 固定长度输出(如 128 位、256 位)。
- 重要的安全性指标之一是“抗碰撞性”:难以找到两个不同输入,输出却相同。
-
两种攻击方式
- 原像攻击:给定一个哈希值,找到一个输入使其对应。需要大约 $2^n$ 次尝试。
- 生日攻击:寻找任意一对输入碰撞。只需要大约 $\sqrt{2^n} = 2^{n/2}$ 次尝试。
-
具体数字
| 哈希长度 n | 输出空间 $2^n$ | 原像攻击复杂度 | 生日攻击复杂度 |
|---|---|---|---|
| 64 位 | $2^{64}$ | $2^{64}$ | $2^{32}$(约 43 亿) |
| 128 位 | $2^{128}$ | $2^{128}$ | $2^{64}$(约 1.8×10¹⁹) |
| 256 位 | $2^{256}$ | $2^{256}$ | $2^{128}$(约 3.4×10³⁸) |
解读:
- MD5(128 位)理论复杂度是 $2^{128}$,但生日攻击只需 $2^{64}$,已被攻破。
- SHA-256(256 位)即使遭遇生日攻击也需要 $2^{128}$,仍然安全。
-
设计启示
- 哈希函数的抗碰撞强度 ≈ 输出长度的一半。
- 想要 128 位安全强度,必须至少使用 256 位哈希。
六、总结
- 生日悖论揭示了:在大样本空间中,重复出现的概率远比直觉要高。
- 关键原因是:样本量 $k$ 与潜在配对数 $k^2/2$ 的平方关系。
- 在密码学中,这直接影响哈希函数的设计。一个 $n$ 位哈希,其抗碰撞强度只有 $n/2$ 位。
- 这也是为什么 MD5、SHA-1 等已过时,而 SHA-256、SHA-3 等才符合现代安全标准。