消息认证码(MAC)
消息认证码(MAC) 是什么?
消息认证码(MAC)使用对称密钥计算的短标签,用于对消息进行认证并检测篡改,计算与验证使用同一个共享密钥。
消息认证码(Message Authentication Code,MAC)是使用对称密钥对消息计算得到的定长标签,验证时必须使用相同的密钥。它提供完整性与真实性,但因为双方都持有该密钥,所以无法提供不可否认性。常见构造包括 HMAC(基于哈希,RFC 2104)、CMAC(CBC-MAC,NIST SP 800-38B)、GMAC(用于 GCM)、Poly1305(在 ChaCha20-Poly1305 中与 ChaCha20 组合,RFC 8439)以及 KMAC(基于 Keccak/SHA-3,NIST SP 800-185)。
之所以存在 HMAC 而不采用朴素的 MAC = H(key ‖ message),是因为 MD5、SHA-1、SHA-256 等 Merkle–Damgård 哈希容易受到长度扩展攻击:知道一个有效标签的攻击者可以在无需密钥的情况下追加数据,并为更长的消息计算出有效标签。HMAC 采用的嵌套结构 H(key ⊕ opad ‖ H(key ⊕ ipad ‖ msg)) 挫败了这种攻击,并具有形式化的安全性证明。
MAC 的验证必须以常数时间进行——逐字节比较标签并提前返回,会通过时序泄露标签长度,这正是导致 2009 年针对 Keyczar 的伪造攻击的原因。MAC 是 TLS 记录认证、IPsec AH、JWT HS256、API 请求签名以及所有 AEAD 模式的基础。对密文计算 MAC(先加密后 MAC,encrypt-then-MAC)优于先 MAC 后加密(MAC-then-encrypt),后者曾导致 Lucky Thirteen 等填充预言攻击。
flowchart LR
subgraph 发送方
M1[消息] --> T1["MAC(key, message)"]
K1[共享密钥] --> T1
T1 --> S[发送消息 + 标签]
end
subgraph 接收方
S --> R["重新计算 MAC(key, message)"]
K2[共享密钥] --> R
R --> C{"以常数时间<br/>与收到的标签比较"}
C -->|相等| OK[接受:真实且完整]
C -->|不同| NO[拒绝:被伪造或被篡改]
end● 示例
- 01
AWS Signature Version 4 请求采用 HMAC-SHA-256 进行认证。
- 02
TLS 1.3 中使用的 ChaCha20-Poly1305 AEAD 通过 Poly1305 对密文进行认证。
● 常见问题
消息认证码(MAC) 是什么?
使用对称密钥计算的短标签,用于对消息进行认证并检测篡改,计算与验证使用同一个共享密钥。 它属于网络安全的 密码学 分类。
消息认证码(MAC) 是什么意思?
使用对称密钥计算的短标签,用于对消息进行认证并检测篡改,计算与验证使用同一个共享密钥。
如何防御 消息认证码(MAC)?
针对 消息认证码(MAC) 的防御通常结合技术控制与运营实践,详见上方完整定义。
消息认证码(MAC) 还有哪些其他名称?
常见的别称包括: MAC, 密码学校验值。