Lec 4 消息认证码(MAC)
MIT 6.1600 · Introduction to Computer Security
TL;DR
- MAC 用共享密钥为消息生成标签,目标是在选择消息攻击下仍无法为新消息伪造有效标签,即 EUF-CMA 安全。
- PRF 可直接导出定长消息 MAC;HMAC、CMAC 与 Poly1305 则处理哈希、分组密码或有限域运算中的实际约束。
- MAC 提供来源与完整性但不提供机密性,也不提供第三方可验证的不可否认性,因为所有验证者都持有可伪造的同一密钥。
1. 问题背景
哈希函数(CRHF)保护文件完整性,但无法防止主动篡改:
- Alice 发送 (m,H(m)) 给 Bob
- 攻击者截获后把 m 换成 m′,同时发送 H(m′)
- Bob 验证通过——完整性被破坏
根本问题:没有密钥,任何人都能计算哈希。
MAC(Message Authentication Code) 引入共享密钥,解决此问题。
2. MAC 的定义
MAC 是一个三元组 (KeyGen,MAC,Verify):
k←KeyGen(1λ)
t←MAC(k,m)
b←Verify(k,m,t)∈{0,1}
- k:共享密钥(Alice 和 Bob 共享,攻击者不知道)
- t:标签(tag)
- 正确性:对所有 k,m,Verify(k,m,MAC(k,m))=1
3. 安全定义:EUF-CMA
EUF-CMA(Existential Unforgeability under Chosen-Message Attack):
安全游戏
EUF-CMA Game
- 挑战者(Challenger)生成 k←KeyGen(1λ)
- 对手 A 可自适应地查询 oracle:
- MAC oracle:输入 mi,得到 ti=MAC(k,mi)
- A 输出伪造 (m∗,t∗)
A 胜利条件:
Verify(k,m∗,t∗)=1∧m∗∈/{m1,m2,…}
(即伪造的消息不在已查询列表中)
安全要求:对任意 PPT 对手 A:
Pr[A wins]≤negl(λ)
4. PRF(伪随机函数)
4.1 定义
PRF(Pseudorandom Function):
F:K×X→Y
对手无法区分 F(k,⋅) 和真正随机函数 R:X→Y,其中 k \xleftarrow{\} \mathcal{K}$。
4.2 PRF 的 MAC 构造
若 F 是安全的 PRF 且 ∣Y∣ 足够大(∣Y∣≥2128):
MAC(k,m)=F(k,m)
Verify(k,m,t)=[t=?F(k,m)]
安全性:若 F 是 PRF,则上述 MAC 满足 EUF-CMA(对于单消息安全,或消息集合有限时)。
5. 实际 MAC 构造
5.1 HMAC(基于哈希的 MAC)
HMAC(k,m)=H((k⊕opad)∥H((k⊕ipad)∥m))
我的理解
能生成合法 MAC 的组件也就具备伪造能力,因此密钥边界必须与被授权的写入边界一致。
- opad=0x5c5c5c...,ipad=0x363636...(固定常数)
- 防止对哈希函数 Length-Extension 攻击
- 基于 SHA-256/SHA-512
5.2 PMAC / CMAC
基于分组密码(AES),可并行化:
PMAC(k,m1∥m2∥…)=⨁iF(k,mi⊕Δi)
Δi 为与块位置相关的 tweak,防止消息块顺序被调换。
5.3 多项式 MAC(GHASH / Poly1305)
对消息块作为多项式系数,在有限域 F2128 上求值:
MAC(k,m1∥…∥mℓ)=m1kℓ+m2kℓ−1+⋯+mℓk∈F2128
安全性:对不同消息,标签碰撞概率 ≤ℓ/2128(差分有界)。
6. MAC 的应用
6.1 消息完整性
Alice 和 Bob 共享密钥 k:
Alice:t←MAC(k,m), 发送 (m,t)
Bob:Verify(k,m,t)=?1
攻击者不知 k,无法伪造合法 (m′,t′)。
6.2 API Token
服务器对用户 ID 生成 token:
token=userid∥MAC(kserver,userid)
客户端存储 token,之后每次请求带上。服务器验证 MAC,确认 token 未被篡改。
6.3 HMAC 用于密钥派生(HKDF)
HKDF(k,info)=HMAC(k,info∥0x01)
7. 反例:不安全的 MAC 构造
7.1 MAC(k,m)=H(m∥k)(Length Extension 攻击)
MD 结构哈希中:
H(m∥k)=H(pad(m∥k))
攻击者已知 (m,t=H(m∥k)) 后,可构造:
m′=pad(m∥k)∥extra
t′=H(t∥extra)(无需知道 k)
从而 H(m′∥k)=t′,伪造成功。
7.2 MAC(k,m)=H(k∥m)(对 CRHF 而非 PRF 可能不安全)
依赖 H 满足 PRF 性质;SHA-256 实践中安全,但理论无保证。HMAC 双层结构是更严格的做法。
8. MAC 与签名的区别
| 特性 | MAC | 数字签名 |
|---|
| 密钥 | 对称(共享) | 非对称(私钥/公钥) |
| 验证者 | 仅知 k 的人 | 任何人(有 vk) |
| 不可否认性 | ✗ | ✓ |
| 计算速度 | 快 | 慢(RSA/ECDSA) |
关键公式
EUF-CMA 定义(简化):
Pr[Verify(k,m∗,AMAC(k,⋅)(1λ))=1 ∧ m∗∈/Q]≤negl(λ)
HMAC:
HMAC(k,m)=H((k⊕opad)∥H((k⊕ipad)∥m))