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

用两条短消息隔离顺序因素
本轮选择HMAC-SHA256与小写十六进制输出,使用公开教学密钥demo-sort-v4。第一条消息是x=1&y=2,第二条交换为y=2&x=1。除了文本顺序,其余输入均保持一致。官网页面分别生成了不同的认证码,这个对照说明业务参数集合相同,并不意味着用于认证的消息序列相同。
规范化必须是双方约定的步骤
有些接口规定键排序,有些明确保留请求顺序,也有接口把路径、方法、时间和正文摘要一并加入。应先从对接规范得到确切拼接规则,再构造待签文本。不能看到结果不一致就自行给所有参数排序,否则可能偏离接收端的算法。重复参数、空字段和分隔符是否保留,也需要明确规定。

重复字段与空参数也要有规则
在参数排序之外,接口还需说明同名参数如何处理、没有值的键是否参加认证,以及分隔符出现在值内部时怎样转义。键值序列不能在一端被视为列表、另一端却先转成会覆盖重复项的对象。先把双方生成的待认证文本按位置对照,找到第一个不同字符,再决定应调整哪一个构造步骤,而不是反复更换摘要算法碰运气。
对照日志要保留可复查的上下文
在获准的开发环境中记录算法、参数拼接方式与必要的长度信息,用虚构或脱敏样本重放差异。不要把真实共享秘密写进排障文章或公开日志。HMAC本身用于认证与完整性检查,既不会隐藏正文,也不自动处理请求重放;时效、去重和访问权限仍属于接口协议需要解决的内容。
演示说明:配图中的密钥仅供公开演示,两张结果图分别对应参数交换前后的独立计算。
功能入口:HMAC生成。