前端用 HMAC 加密签名总是验证失败,是哪里出错了?
我在 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); // 后端说这个值不对
&是 HTML 实体编码,实际请求参数应该用&。你在代码里写的是:
但后端解析的原始参数是
timestamp=1712345678&userId=123,这两个字符串做 HMAC 出来的结果完全不同。改一下就行:
如果你是从 URL 或者表单里获取的参数,要确保获取的是原始字符串,而不是 HTML 编码后的。
另外提醒一下,参数顺序也要保持一致,如果后端是先 userId 再 timestamp,你也要按那个顺序拼接。