3. MAC 算法
- Message Authentication Code (MAC) 算法
[RFC9052] 第 8.2 节包含对 MAC 算法的通用描述. 本节定义两种 MAC 算法的约定.
3.1. Hash-Based Message Authentication Codes (HMACs)
HMAC [RFC2104] [RFC4231] 设计用于处理长度扩展攻击. HMAC 算法还设计为允许直接插入新的 hash function, 而无需更改 hash function. HMAC 设计过程已被证明是稳健的; 尽管 MD5 等 hash function 的安全性随时间降低, 但 HMAC 与 MD5 结合使用的安全性尚未被证明已遭破坏 [RFC6151].
HMAC 算法由 inner padding, outer padding, hash function (h) 和 authentication tag value length 参数化. 对于本规范, inner 和 outer padding 固定为 [RFC2104] 中设置的值. authentication tag 的长度对应于生成伪造的难度. 为在受限环境中使用, 我们定义了一种截断的 HMAC 算法. 目前尚无已知的截断问题; 然而, message tag 的安全强度会相应降低. 截断时, 保留并传输最左侧的 tag-length 比特.
本文档定义的算法见表 3.
+=============+=======+=========+============+======================+ | Name | Value | Hash | Tag Length | Description | +=============+=======+=========+============+======================+ | HMAC | 4 | SHA-256 | 64 | HMAC w/ SHA-256 | | 256/64 | | | | truncated to 64 bits | +-------------+-------+---------+------------+----------------------+ | HMAC | 5 | SHA-256 | 256 | HMAC w/ SHA-256 | | 256/256 | | | | | +-------------+-------+---------+------------+----------------------+ | HMAC | 6 | SHA-384 | 384 | HMAC w/ SHA-384 | | 384/384 | | | | | +-------------+-------+---------+------------+----------------------+ | HMAC | 7 | SHA-512 | 512 | HMAC w/ SHA-512 | | 512/512 | | | | | +-------------+-------+---------+------------+----------------------+
表 3: HMAC Algorithm Values
某些 recipient algorithm 传输 key, 而其他算法从 secret data 派生 key. 对于传输 key 的算法 (例如 AES Key Wrap), HMAC key 的大小 SHOULD 与底层 hash function 的输出大小相同. 对于派生 key 的算法 (例如 ECDH), 派生 key MUST 与底层 hash function 的输出大小相同.
对此算法使用 COSE key 时, 执行以下检查:
-
"kty" 字段 MUST 存在, 且 MUST 为 "Symmetric".
-
如果 "alg" 字段存在, 它 MUST 匹配正在使用的 HMAC algorithm.
-
如果 "key_ops" 字段存在, 创建 HMAC authentication tag 时它 MUST 包含 "MAC create".
-
如果 "key_ops" 字段存在, 验证 HMAC authentication tag 时它 MUST 包含 "MAC verify".
创建和验证 MAC 值的实现 MUST 验证 key type, key length 和 algorithm 对相关实体而言正确且适当.
3.1.1. HMAC 的安全考量
即使与已削弱的 hash algorithm 一起使用, HMAC 也已证明能够抵抗攻击. 当前已知最佳攻击是暴力破解 key. 这意味着 key size 将直接关系到 HMAC 操作的安全性.
3.2. AES Message Authentication Code (AES-CBC-MAC)
AES-CBC-MAC 是使用 AES 作为 block cipher 对 CBC-MAC 构造 ([MAC] 中定义) 的实例化. 为简洁起见, 我们也使用 "AES-MAC" 指代 AES-CBC-MAC. (注意, 这与 AES Cipher-Based Message Authentication Code (AES-CMAC) [RFC4493] 不是同一算法.)
AES-CBC-MAC 由 key length, authentication tag length 和所用 Initialization Vector (IV) 参数化. 对所有这些算法而言, IV 固定为全零. 我们为不同 key 和 tag 长度提供算法数组. 本文档定义的算法见表 4.
+=========+=======+============+============+==================+
| Name | Value | Key Length | Tag Length | Description |
+=========+=======+============+============+==================+
| AES-MAC | 14 | 128 | 64 | AES-MAC 128-bit |
| 128/64 | | | | key, 64-bit tag |
+---------+-------+------------+------------+------------------+
| AES-MAC | 15 | 256 | 64 | AES-MAC 256-bit |
| 256/64 | | | | key, 64-bit tag |
+---------+-------+------------+------------+------------------+
| AES-MAC | 25 | 128 | 128 | AES-MAC 128-bit |
| 128/128 | | | | key, 128-bit tag |
+---------+-------+------------+------------+------------------+
| AES-MAC | 26 | 256 | 128 | AES-MAC 256-bit |
| 256/128 | | | | key, 128-bit tag |
+---------+-------+------------+------------+------------------+
表 4: AES-MAC Algorithm Values
Key 可以从 key structure 或 recipient structure 获得. 创建和验证 MAC 值的实现 MUST 验证 key type, key length 和 algorithm 对相关实体而言正确且适当.
对此算法使用 COSE key 时, 执行以下检查:
-
"kty" 字段 MUST 存在, 且 MUST 为 "Symmetric".
-
如果 "alg" 字段存在, 它 MUST 匹配正在使用的 AES-MAC algorithm.
-
如果 "key_ops" 字段存在, 创建 AES-MAC authentication tag 时它 MUST 包含 "MAC create".
-
如果 "key_ops" 字段存在, 验证 AES-MAC authentication tag 时它 MUST 包含 "MAC verify".
3.2.1. AES-CBC-MAC 的安全考量
针对 Cipher Block Chaining Message Authentication Code (CBC-MAC) 存在多种需要考虑的攻击.
-
单个 key 只能用于固定或已知长度的消息. 如果不是这样, 攻击者在给定两个 message/tag pair 时将能够生成带有效 tag 的消息. 这可以通过为不同长度的消息使用不同 key 来处理. 当前结构缓解了这个问题, 因为会构建并签署一个包含长度的特定编码结构. (CMAC 也处理此问题.)
-
在 Cipher Block Chaining (CBC) 模式中, 如果同一个 key 同时用于加密和认证操作, 攻击者可以生成具有有效 authentication code 的消息.
-
如果 IV 可以被修改, 则消息可以被伪造. 通过将 IV 固定为全零来处理此问题.