摘要

  • RFC 2104 以不同的固定内垫和外垫进行两遍带密钥哈希,使软件可以原样复用已有的迭代哈希实现。
  • 底层哈希能够替换,输出也可以按协议截断;因此算法、密钥处理与标签长度都是标签语义的一部分。
  • 标签匹配是特定密钥、算法与字节串之间的局部证据,不等于唯一发送者、授权、新鲜度、规范化、机密性、送达或正确部署。

1997 年,HMAC 最重要的工程动作不是再发明一个哈希函数,而是给已有哈希加上一副可靠的框架。MD5、SHA-1 等迭代哈希已有快速实现,网络协议也确实需要带密钥的完整性检查;困难在于,简单地把秘密拼在消息前后,并不能自然获得一套清楚、可分析的安全属性。

RFC 2104 把此前的密码学研究压缩成一个小接口。它的成功来自克制:明确计算什么,不假装替使用它的协议决定其余一切。

两个固定垫把内外两层分开

RFC 2104 用 H 表示哈希函数,用 B 表示输入块长度,用 L 表示输出长度。密钥长于 B 时,先经过 H 压成 L 字节;较短密钥补零至 B。随后使用两个不同的 B 字节常量:ipad 是 0x36 的重复,opad 是 0x5c 的重复。

最终构造可写作 H((K xor opad) || H((K xor ipad) || text))。内层把一份密钥派生块与消息合在一起,外层再把另一份密钥派生块与内层摘要合在一起。两次都调用未经修改的 H。

因此,规范并未要求每个协议复制一套新密码代码。它把共同部分收紧为几项规则:密钥如何适配块长、内外层如何分离、结果如何产生。消息含义、编码方式、发送者身份、授权与后续动作,则继续由相邻系统负责。

优化状态同样属于秘密

RFC 2104 允许实现预先计算处理 (K xor ipad) 与 (K xor opad) 后的中间哈希状态。对短消息而言,这可以省去每次认证时的两个压缩步骤,而且不会改变线上互操作。

规范同时指出,这些缓存状态必须像密钥一样保护。它揭示了实现层面的一条长期规律:派生物不因换了形态就失去敏感性。若系统把原始 K 锁好,却让可重复利用的中间状态暴露,数学公式仍然正确,安全边界已经破裂。

密钥的随机性、交换、保管与更新也不会由 HMAC 自动完成。RFC 2104 把随机选择、周期更新、正确实现以及安全密钥交换列为必要条件。两层结构能统一计算,不能替组织创造良好的密钥治理。

标签需要上下文才能成为证据

协议可以只发送 HMAC 结果最左侧的 t 位。RFC 2104 给出了当时的截断建议,但把具体 t 留给应用选择。较短标签改变伪造者猜中的成本,因此“验证通过”必须连同算法、密钥标识、字节表示和标签长度一起记录。

其中最容易被忽略的是“确切字节”。HMAC 不知道两份 JSON、两个 Unicode 字符串或两组头字段是否语义等价。发送端若对一种序列化签入,接收端却重建另一种,标签会失败;双方若一致地认证了错误字段,标签又会成功。规范化是协议工作,不是 MAC 暗中提供的语义理解。

共享密钥还限制了归因能力。所有合法持有者都能生成相同形式的有效标签。成功验证可以支持“某个持钥者为这些字节产生了匹配值”,却不能在多个持钥者之间唯一指出一个自然人、进程或主机。它不是数字签名,也不自动产生不可否认性。

测试向量把文字变成可执行共识

同年 9 月,RFC 2202 发布 HMAC-MD5 和 HMAC-SHA-1 测试用例。给定密钥和消息,再公布预期结果,独立实现便有了共同的字节级检查点。这种一致性证据推动了互操作,也让规范不只停留在公式上。

但测试通过的收据很窄:若干已知输入得到了约定输出。它不证明所有长度和错误路径正确,不证明比较操作无侧信道,不证明生产环境选了正确密钥,也不证明存在重放状态或授权检查。正因为不夸大它,互操作测试才有清晰价值。

可替换性是接口属性,不是自动迁移

RFC 2104 把 MD5 与 SHA-1 当作当时的例子,却故意让 H 保持通用。后来,RFC 4868 为 IPsec 规定 HMAC-SHA-256、HMAC-SHA-384 与 HMAC-SHA-512;RFC 6151 又更新了 MD5 与 HMAC-MD5 的安全判断,并要求新的协议设计不再采用 HMAC-MD5。

这段历史说明接口确实经受住了算法变化,却不说明迁移会自行发生。协议标识、协商规则、实现、策略、测试和密钥生命周期都要同步移动。HMAC 降低了需要更换的概念数量,没有取消更换所需的组织成本。

NIST 后来的 FIPS 198-1 进一步显示了 HMAC 的制度性扩散。稳定的是组合方式;最初的具体哈希并没有因此获得永久地位。

有效标签只是较长决策链的一张收据

旧消息连同旧标签再次出现时,数学验证仍然可以成功。新鲜度必须由 nonce、计数器、时间窗或其他状态建立,还要定义重置和重复处理。授权需要把已认证上下文映射到允许动作。机密性需要加密。送达、持久化和业务提交需要下游回执。实现与部署正确还要靠审查、测试和运行控制。

RFC 2104 的持久遗产,不是一个十六进制值能替系统回答所有信任问题,而是互联网得到了一块边界清楚的通用零件。两遍哈希建立了可靠的 MAC 接口;信任仍要在它周围逐层组装。

来源