Archipelago

Lec 4消息认证码(MAC)

讲义完成更新于 2026-09-16

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))(m, H(m)) 给 Bob
  • 攻击者截获后把 mm 换成 m′m',同时发送 H(m′)H(m')
  • Bob 验证通过——完整性被破坏

根本问题:没有密钥,任何人都能计算哈希。

MAC(Message Authentication Code) 引入共享密钥,解决此问题。

2. MAC 的定义

MAC 是一个三元组 (KeyGen,MAC,Verify)(\text{KeyGen}, \text{MAC}, \text{Verify}):

k←KeyGen(1λ)k \leftarrow \text{KeyGen}(1^\lambda) t←MAC(k,m)t \leftarrow \text{MAC}(k, m) b←Verify(k,m,t)∈{0,1}b \leftarrow \text{Verify}(k, m, t) \in \{0, 1\}

  • kk:共享密钥(Alice 和 Bob 共享,攻击者不知道)
  • tt:标签(tag)
  • 正确性:对所有 k,mk, m,Verify(k,m,MAC(k,m))=1\text{Verify}(k, m, \text{MAC}(k, m)) = 1

3. 安全定义:EUF-CMA

EUF-CMA(Existential Unforgeability under Chosen-Message Attack):

安全游戏

EUF-CMA Game\boxed{\text{EUF-CMA Game}}

  1. 挑战者(Challenger)生成 k←KeyGen(1λ)k \leftarrow \text{KeyGen}(1^\lambda)
  2. 对手 A\mathcal{A} 可自适应地查询 oracle:
    • MAC oracle:输入 mim_i,得到 ti=MAC(k,mi)t_i = \text{MAC}(k, m_i)
  3. A\mathcal{A} 输出伪造 (m∗,t∗)(m^*, t^*)

A\mathcal{A} 胜利条件: Verify(k,m∗,t∗)=1∧m∗∉{m1,m2,…}\text{Verify}(k, m^*, t^*) = 1 \quad \wedge \quad m^* \notin \{m_1, m_2, \ldots\}

(即伪造的消息不在已查询列表中)

安全要求:对任意 PPT 对手 A\mathcal{A}: Pr⁡[A wins]≤negl(λ)\Pr[\mathcal{A} \text{ wins}] \leq \mathrm{negl}(\lambda)

4. PRF(伪随机函数)

4.1 定义

PRF(Pseudorandom Function):

F:K×X→YF: \mathcal{K} \times \mathcal{X} \to \mathcal{Y}

对手无法区分 F(k,⋅)F(k, \cdot) 和真正随机函数 R:X→YR: \mathcal{X} \to \mathcal{Y},其中 k \xleftarrow{\} \mathcal{K}$。

4.2 PRF 的 MAC 构造

若 FF 是安全的 PRF 且 ∣Y∣|\mathcal{Y}| 足够大(∣Y∣≥2128|Y| \geq 2^{128}):

MAC(k,m)=F(k,m)\text{MAC}(k, m) = F(k, m) Verify(k,m,t)=[t=?F(k,m)]\text{Verify}(k, m, t) = [t \stackrel{?}{=} F(k, m)]

安全性:若 FF 是 PRF,则上述 MAC 满足 EUF-CMA(对于单消息安全,或消息集合有限时)。

5. 实际 MAC 构造

5.1 HMAC(基于哈希的 MAC)

HMAC(k,m)=H((k⊕opad)∥H((k⊕ipad)∥m))\text{HMAC}(k, m) = H\big((k \oplus \text{opad}) \| H((k \oplus \text{ipad}) \| m)\big)

我的理解

能生成合法 MAC 的组件也就具备伪造能力,因此密钥边界必须与被授权的写入边界一致。

  • opad=0x5c5c5c...\text{opad} = \texttt{0x5c5c5c...},ipad=0x363636...\text{ipad} = \texttt{0x363636...}(固定常数)
  • 防止对哈希函数 Length-Extension 攻击
  • 基于 SHA-256/SHA-512

5.2 PMAC / CMAC

基于分组密码(AES),可并行化:

PMAC(k,m1∥m2∥…)=⨁iF(k,mi⊕Δi)\text{PMAC}(k, m_1 \| m_2 \| \ldots) = \bigoplus_i F(k, m_i \oplus \Delta_i)

Δi\Delta_i 为与块位置相关的 tweak,防止消息块顺序被调换。

5.3 多项式 MAC(GHASH / Poly1305)

对消息块作为多项式系数,在有限域 F2128\mathbb{F}_{2^{128}} 上求值:

MAC(k,m1∥…∥mℓ)=m1kℓ+m2kℓ−1+⋯+mℓk∈F2128\text{MAC}(k, m_1 \| \ldots \| m_\ell) = m_1 k^\ell + m_2 k^{\ell-1} + \cdots + m_\ell k \in \mathbb{F}_{2^{128}}

安全性:对不同消息,标签碰撞概率 ≤ℓ/2128\leq \ell / 2^{128}(差分有界)。

6. MAC 的应用

6.1 消息完整性

Alice 和 Bob 共享密钥 kk:

Alice:t←MAC(k,m), 发送 (m,t)\text{Alice}: t \leftarrow \text{MAC}(k, m),\ \text{发送}\ (m, t) Bob:Verify(k,m,t)=?1\text{Bob}: \text{Verify}(k, m, t) \stackrel{?}{=} 1

攻击者不知 kk,无法伪造合法 (m′,t′)(m', t')。

6.2 API Token

服务器对用户 ID 生成 token:

token=userid∥MAC(kserver,userid)\text{token} = \text{userid} \| \text{MAC}(k_\text{server}, \text{userid})

客户端存储 token,之后每次请求带上。服务器验证 MAC,确认 token 未被篡改。

6.3 HMAC 用于密钥派生(HKDF)

HKDF(k,info)=HMAC(k,info∥0x01)\text{HKDF}(k, \text{info}) = \text{HMAC}(k, \text{info} \| \texttt{0x01})

7. 反例:不安全的 MAC 构造

7.1 MAC(k,m)=H(m∥k)\text{MAC}(k, m) = H(m \| k)(Length Extension 攻击)

MD 结构哈希中:

H(m∥k)=H(pad(m∥k))H(m \| k) = H(\text{pad}(m \| k))

攻击者已知 (m,t=H(m∥k))(m, t = H(m \| k)) 后,可构造:

m′=pad(m∥k)∥extram' = \text{pad}(m \| k) \| \text{extra} t′=H(t∥extra)t' = H(t \| \text{extra})(无需知道 kk)

从而 H(m′∥k)=t′H(m' \| k) = t',伪造成功。

7.2 MAC(k,m)=H(k∥m)\text{MAC}(k, m) = H(k \| m)(对 CRHF 而非 PRF 可能不安全)

依赖 HH 满足 PRF 性质;SHA-256 实践中安全,但理论无保证。HMAC 双层结构是更严格的做法。

8. MAC 与签名的区别

特性MAC数字签名
密钥对称(共享)非对称(私钥/公钥)
验证者仅知 kk 的人任何人(有 vkvk)
不可否认性✗✓
计算速度快慢(RSA/ECDSA)

关键公式

EUF-CMA 定义(简化):

Pr⁡[Verify(k,m∗,AMAC(k,⋅)(1λ))=1 ∧ m∗∉Q]≤negl(λ)\Pr\left[\text{Verify}(k, m^*, \mathcal{A}^{\text{MAC}(k,\cdot)}(1^\lambda)) = 1\ \wedge\ m^* \notin Q\right] \leq \mathrm{negl}(\lambda)

HMAC:

HMAC(k,m)=H((k⊕opad)∥H((k⊕ipad)∥m))\text{HMAC}(k, m) = H\big((k \oplus \text{opad}) \| H((k \oplus \text{ipad}) \| m)\big)