前端用 HMAC-SHA256 加密为什么结果和后端对不上?
我正在对接一个 API,要求用 HMAC-SHA256 对请求体签名,但前端算出来的 signature 和后端不一致,排查了一天没找到原因。
我用的是 CryptoJS,key 和 message 都确认过是字符串,也试过 encode UTF-8,但结果还是不对。是不是哪里漏了?
const message = JSON.stringify({ id: 123, action: 'submit' });
const secret = 'mySecretKey';
const hash = CryptoJS.HmacSHA256(message, secret);
const signature = hash.toString(CryptoJS.enc.Hex);
console.log(signature); // 输出和后端不一样
你可以试试先对
message做一次 UTF-8 编码,然后再计算 HMAC。修改后的代码可以这样:这样处理之后,签名应该会和后端对上了。如果还不一样,那就得检查一下后端是不是对
secret或者message做了其他处理了。希望这能帮到你,别再折腾一天了。后端通常是对参数按 key 排序后再拼接签名的,不是直接 JSON.stringify。
自己写个排序后的字符串拼接:
你先试试这个,如果还对不上,再看看后端具体怎么拼接的。