HMAC为何会因参数顺序改变?

KKCE 编辑团队 HMAC生成

内容摘要

相同参数如果按不同顺序拼成消息,HMAC认证码也可能随之变化。计算过程处理的是输入序列,而不是抽象的键值集合。本文用KKCE做一次单因素对照,检查接口双方为何需要明确约定待认证文本的组成方式。

相同参数如果按不同顺序拼成消息,HMAC认证码也可能随之变化。计算过程处理的是输入序列,而不是抽象的键值集合。本文用KKCE做一次单因素对照,检查接口双方为何需要明确约定待认证文本的组成方式。

HMAC为何会因参数顺序改变?:KKCE官网演示
KKCE官网本轮演示实拍,输入为构造样本;结果与可见字段以截图当时为准。

用两条短消息隔离顺序因素

本轮选择HMAC-SHA256与小写十六进制输出,使用公开教学密钥demo-sort-v4。第一条消息是x=1&y=2,第二条交换为y=2&x=1。除了文本顺序,其余输入均保持一致。官网页面分别生成了不同的认证码,这个对照说明业务参数集合相同,并不意味着用于认证的消息序列相同。

规范化必须是双方约定的步骤

有些接口规定键排序,有些明确保留请求顺序,也有接口把路径、方法、时间和正文摘要一并加入。应先从对接规范得到确切拼接规则,再构造待签文本。不能看到结果不一致就自行给所有参数排序,否则可能偏离接收端的算法。重复参数、空字段和分隔符是否保留,也需要明确规定。

HMAC为何会因参数顺序改变?:KKCE官网演示
同一教学密钥、同一算法与输出形式,消息交换参数顺序后的独立计算结果。

重复字段与空参数也要有规则

在参数排序之外,接口还需说明同名参数如何处理、没有值的键是否参加认证,以及分隔符出现在值内部时怎样转义。键值序列不能在一端被视为列表、另一端却先转成会覆盖重复项的对象。先把双方生成的待认证文本按位置对照,找到第一个不同字符,再决定应调整哪一个构造步骤,而不是反复更换摘要算法碰运气。

对照日志要保留可复查的上下文

在获准的开发环境中记录算法、参数拼接方式与必要的长度信息,用虚构或脱敏样本重放差异。不要把真实共享秘密写进排障文章或公开日志。HMAC本身用于认证与完整性检查,既不会隐藏正文,也不自动处理请求重放;时效、去重和访问权限仍属于接口协议需要解决的内容。

演示说明:配图中的密钥仅供公开演示,两张结果图分别对应参数交换前后的独立计算。

功能入口:HMAC生成。