前端用 HMAC 加密签名总是验证失败,是哪里出错了?

南宫子晴 阅读 3

我在 React 项目里尝试用 HMAC-SHA256 对请求参数做签名,后端用的是 Node.js 验证,但每次签名都对不上。我确认了 key 和数据都一样,是不是浏览器环境没法直接用 crypto?

试过用 window.crypto.subtle,但发现它不支持 HMAC 的 importKey 方式传字符串密钥,转成 ArrayBuffer 又很麻烦。现在改用第三方库 crypto-js,但结果还是和后端不一致。

import CryptoJS from 'crypto-js';

const secret = 'my-secret-key';
const params = 'timestamp=1712345678&userId=123';
const signature = CryptoJS.HmacSHA256(params, secret).toString();

console.log(signature); // 后端说这个值不对
我来解答 赞 1 收藏
二维码
手机扫码查看
1 条解答
Good“子皓
问题找到了,你代码里的 & 是 HTML 实体编码,实际请求参数应该用 &

你在代码里写的是:
const params = 'timestamp=1712345678&userId=123';


但后端解析的原始参数是 timestamp=1712345678&userId=123,这两个字符串做 HMAC 出来的结果完全不同。

改一下就行:

import CryptoJS from 'crypto-js';

const secret = 'my-secret-key';
// 用 & 不是 &
const params = 'timestamp=1712345678&userId=123';
const signature = CryptoJS.HmacSHA256(params, secret).toString();

console.log(signature);


如果你是从 URL 或者表单里获取的参数,要确保获取的是原始字符串,而不是 HTML 编码后的。

另外提醒一下,参数顺序也要保持一致,如果后端是先 userId 再 timestamp,你也要按那个顺序拼接。
点赞
2026-03-12 18:06