Lec 3 碰撞抗性与文件认证
MIT 6.1600 · Introduction to Computer Security
TL;DR
- 碰撞抗性要求攻击者无法有效找到两个不同输入产生同一摘要;对 n 位输出,通用生日攻击约需 2n/2 次尝试。
- 可信的小摘要可以认证大文件,Merkle 树进一步把单块成员证明压缩到对数大小,但根摘要本身仍需从可信渠道获得。
- 哈希函数没有密钥,不能独自抵御主动替换;承诺、文件认证和签名分别还需要隐藏性、可信摘要或密钥机制。
1. 哈希函数的基本定义
密码哈希函数(Cryptographic Hash Function, CHF):
H:{0,1}∗→{0,1}n
将任意长度输入映射到固定长度 n bits(通常 n=256 或 512)。
2. 碰撞抗性(Collision Resistance)
2.1 定义
碰撞(Collision):存在两个不同输入 x=x′,使得 H(x)=H(x′)。
碰撞抗性(CRHF):对任意 PPT(概率多项式时间)对手 A:
Pr[(x,x′)←A(H) : x=x′ ∧ H(x)=H(x′)]≤negl(λ)
注意:碰撞一定存在(鸽巢原理,∣{0,1}∗>∣{0,1}n∣),但无法有效找到。
2.2 生日界(Birthday Bound)
若攻击者随机采样 q 个输入并寻找碰撞:
Pr[collision found]≈2n+1q2
当 q≈2n/2 时碰撞概率约 1/2。
因此 n=256 bits 的哈希函数,暴力碰撞攻击需 ≈2128 次,安全。
2.3 CRHF 的意义
碰撞抗性是比预像抗性(Preimage Resistance)更强的性质:
| 性质 | 定义 |
|---|
| 预像抗性(One-way) | 已知 h,难找 x 使 H(x)=h |
| 第二预像抗性 | 已知 x,难找 x′=x 使 H(x)=H(x′) |
| 碰撞抗性 | 难找任意 (x,x′) 使 x=x′ 且 H(x)=H(x′) |
CRHF⇒第二预像抗性⇒预像抗性
3. 文件认证(File Authentication)
3.1 问题设定
Alice 想从不可信服务器下载文件 F,保证下载到的内容没有被篡改。
方案:
- 下载前,Alice 从可信渠道获得 H(F)(例如软件官网上列出的 SHA-256 校验和)
- 下载完成后,计算 H(F′),与已知的 H(F) 比对
如果 H(F′)=H(F),那么由碰撞抗性可知 F′=F(否则即发现了碰撞)。
3.2 摘要(Digest)作为简洁表示
哈希值可视为文件的指纹(fingerprint):
- 固定长度(32 bytes for SHA-256),无论文件多大
- 可公开发布在小带宽信道(如邮件、公告板)
- 对比时 O(n) 时间
3.3 Merkle 树(用于大规模文件认证)
当文件被分为 n 块 F1,…,Fn 时,Merkle 树允许:
- 完整性验证:无需下载全部块即可验证某块 Fi 的合法性
- 认证路径长度:O(logn)
构造方式(二叉树底向上):
hi=H(Fi)(叶节点)
hparent=H(hleft∥hright)(内节点)
根哈希 hroot 为整棵树的摘要,需从可信渠道获取。
验证 Fi 时只需提供从 Fi 到根的兄弟节点哈希(认证路径),验证者自底向上重新计算即可。
4. 现实中的哈希函数
SHA-2 系列
| 变体 | 输出长度 | 安全性 |
|---|
| SHA-256 | 256 bits | 2128 安全 |
| SHA-512 | 512 bits | 2256 安全 |
SHA-256 内部结构:Merkle-Damgård 构造
H(m)=f(f(f(IV,m1),m2),…,mk)
其中 IV 是固定初始值,m1,…,mk 为填充后的消息块,f 是压缩函数。
SHA-3(Keccak)
基于 Sponge 结构,吸收(absorb)阶段与挤出(squeeze)阶段分离,抗 Length-Extension 攻击。
5. 不可以用 CRHF 做的事
CRHF 不提供密钥控制的认证!如果 Alice 直接发送 (m,H(m)) 给 Bob:
- 攻击者拦截消息,把 m 换成 m′,同时发送 H(m′)
- Bob 验证通过——但收到了假消息
⇒ 需要 MAC 来提供带密钥的消息认证(见 Lec 4)
6. 承诺方案(Commitment Scheme)
定义
承诺方案允许 Alice 在不透露内容的情况下"锁定"一个值,之后再公开:
- Commit:c←Commit(m;r),r 为随机数
- Open:公开 (m,r),验证者检查 c=?Commit(m;r)
安全性质
| 性质 | 含义 |
|---|
| 隐藏性(Hiding) | c 不泄露 m 的任何信息 |
| 绑定性(Binding) | Alice 无法在公开后更改 m(不存在 m′=m 使 c=Commit(m′;r′)) |
基于 CRHF 的简单构造
c=H(r∥m)r${0,1}256
- 绑定:找到 (m′,r′) 使 H(r∥m)=H(r′∥m′) 即找到碰撞
- 隐藏:r 随机且足够长,H 的预像抗性保证 m 被隐藏
关键要点
- CRHF 是文件完整性验证的基础:H(F) 即文件指纹
- 生日攻击要求 n≥256 bits 才安全(2128 暴力代价)
- Merkle 树将认证开销从 O(n) 降为 O(logn)
- CRHF 不提供消息认证(无密钥),需 MAC 配合
我的理解
哈希只能把大对象的信任压缩成一个摘要,不能凭空创造信任;系统仍需保护摘要的来源与分发渠道。