消息认证码
消息认证码(MAC)使用共享密钥生成一个短标签,接收方可以通过该标签验证消息的完整性和真实性,从而检测任何篡改或伪造。
Definition
消息认证码是一种对称原语,给定一个密钥和一条消息,它会生成一个固定长度的标签,使得任何没有该密钥的人都无法伪造任何新消息的有效标签,即使在看到选择消息上的标签之后也是如此。
Scope
本主题涵盖对称认证:在选择消息攻击下的存在性不可伪造性这一安全目标,基于哈希函数(HMAC)和分组密码(CMAC、GMAC)的MAC构造,以及它们与加密的结合以形成认证加密(先加密后认证,AES-GCM)。它解决了诸如长度扩展和常数时间标签比较的必要性等陷阱。它不包括数字签名,数字签名使用公钥密码学提供公开可验证性和不可否认性。
Core questions
- 共享密钥如何让接收方检测到消息的任何修改?
- 在选择消息攻击下的存在性不可伪造性对安全MAC有什么要求?
- 安全的MAC是如何从哈希函数(HMAC)和分组密码(CMAC)构建的?
- 加密和认证应如何结合以同时保护机密性和完整性?
- 为什么标签比较必须是常数时间,以及哪些攻击利用了时间泄露?
Key concepts
- 认证标签
- 存在性不可伪造性
- 选择消息攻击
- HMAC
- CMAC和GMAC
- 认证加密(AEAD)
- 先加密后认证
- 常数时间比较
- 重放保护
Key theories
- 选择消息攻击下的存在性不可伪造性
- 标准的MAC安全定义:一个能够请求其选择消息标签的攻击者,仍然无法生成任何它未查询过的消息的有效标签,从而使伪造变得不可行。
- HMAC和认证加密
- HMAC将密钥哈希嵌套两次,从而从任何标准哈希函数生成可证明安全的MAC;通过先加密后认证(或使用AES-GCM)将MAC与加密结合,可以生成同时保护机密性和完整性的认证加密。
Mechanisms
HMAC计算H((K xor opad) || H((K xor ipad) || message)),其中H是哈希函数,ipad/opad是固定填充;嵌套结构可以抵御长度扩展,并且如果压缩函数是伪随机函数,则HMAC是可证明安全的。分组密码MAC,例如CMAC,通过对消息块进行链式加密并进行最终的密钥调整来工作。认证加密模式,例如AES-GCM,通过对密文计算伽罗瓦域MAC(GMAC),以一次性绑定机密性和完整性。
Clinical relevance
MAC认证了几乎所有安全的网络流量:HMAC是TLS记录完整性、IPsec、JSON Web Tokens和AWS风格API请求签名的基础,而AES-GCM在TLS 1.3和磁盘加密中提供认证加密。验证MAC可以阻止攻击者悄悄修改密文或重放捕获的消息。
Evidence & guidelines
HMAC在FIPS 198-1和RFC 2104中标准化;CMAC在NIST SP 800-38B中标准化;GCM/GMAC在NIST SP 800-38D中标准化。最佳实践倾向于认证加密(AEAD)构造和先加密后认证的顺序;旧版TLS中使用的先认证后加密顺序导致了填充预言攻击。
History
早期的MAC是使用CBC-MAC模式的DES构建的。发现朴素的密钥哈希MAC容易受到长度扩展攻击后,Bellare、Canetti和Krawczyk于1996年引入了HMAC,并很快被标准化。2000年代,认证加密及其专用AEAD模式(如GCM和CCM)被正式化,现在已成为保护传输中数据的默认方式。
Key figures
- Mihir Bellare
- Ran Canetti
- Hugo Krawczyk
- Phillip Rogaway
Related topics
Seminal works
- bellare1996hmac
- katz2020
- menezes1996
Frequently asked questions
- MAC和数字签名有什么区别?
- 两者都对消息进行认证,但MAC使用共享密钥,因此任何可以验证标签的方也可能生成它——不存在不可否认性。数字签名使用私钥进行签名,公钥进行验证,因此只有签名者才能创建它,并且任何人都可以检查它。
- 我应该先加密还是先认证?
- 推荐的顺序是先加密后认证:加密明文,然后计算密文的MAC。这使得接收方可以在解密之前拒绝伪造的密文,并避免了由先认证后加密顺序引起的填充预言攻击和其他攻击。