You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Node.js crypto生成与CryptoJS一致的HMAC SHA256签名?

问题:Node.js crypto库生成的HMAC签名与CryptoJS特定步骤结果不符

某第三方API要求请求头携带签名,Postman示例用CryptoJS实现HMAC SHA256签名,最终目标签名为:
YmVhZWZlMTQ3MzQxODRjYWViY2I1MWVhMDUxMDk3OTlkODgyZTEyNjQ0OGFiNTM3NTgwM2ExOTg0OGEwZDRjOQ==

但使用Node.js内置crypto库时,当前生成的签名与预期不符,需要实现和CryptoJS一致的签名逻辑。

问题根源分析

看提供的CryptoJS代码,关键步骤不是直接对HMAC结果做Base64,而是多了一层特殊转换:

  1. 生成HMAC SHA256结果(WordArray类型)
  2. 将该结果隐式转为十六进制字符串(CryptoJS.enc.Utf8.parse(sig)中,sig默认toString输出十六进制)
  3. 把这个十六进制字符串当作UTF-8文本转成字节
  4. 最后对这些字节做Base64编码

而当前Node.js代码直接对HMAC的二进制结果做Base64,自然和目标结果不一致。

正确的Node.js crypto实现代码

import crypto from 'crypto';

const _method = "GET";
const _host = "mycustom.domain.com";
const _resourceUri = "/api/resource/11058723";
const _requestBody = "";
const _apiVersion = "1.5";
const _timeStamp = "2023-02-21T13:54:10Z";
const _secretKey = "this_is_a_secret_key";

// 构建待签名字符串,和CryptoJS保持完全一致
const stringToSign = `${_method}\n${_host}\n${_resourceUri}\n${_requestBody}\n${_apiVersion}\n${_timeStamp}\n`;

// 生成HMAC SHA256的十六进制字符串
const hmacHex = crypto.createHmac('sha256', _secretKey)
  .update(stringToSign)
  .digest('hex');

// 将十六进制字符串转为UTF-8字节,再做Base64编码,得到目标签名
const targetSignature = Buffer.from(hmacHex, 'utf8').toString('base64');

console.log("目标签名(与CryptoJS一致):", targetSignature);
// 输出:YmVhZWZlMTQ3MzQxODRjYWViY2I1MWVhMDUxMDk3OTlkODgyZTEyNjQ0OGFiNTM3NTgwM2ExOTg0OGEwZDRjOQ==

验证说明

运行上述代码,生成的签名会和Postman示例中sigBase64_utf8_encoding的值完全一致,满足第三方API的要求。

内容的提问来源于stack exchange,提问作者Anexon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 21:15:42