如何用Node.js crypto生成与CryptoJS一致的HMAC SHA256签名?
问题:Node.js crypto库生成的HMAC签名与CryptoJS特定步骤结果不符
某第三方API要求请求头携带签名,Postman示例用CryptoJS实现HMAC SHA256签名,最终目标签名为:YmVhZWZlMTQ3MzQxODRjYWViY2I1MWVhMDUxMDk3OTlkODgyZTEyNjQ0OGFiNTM3NTgwM2ExOTg0OGEwZDRjOQ==
但使用Node.js内置crypto库时,当前生成的签名与预期不符,需要实现和CryptoJS一致的签名逻辑。
问题根源分析
看提供的CryptoJS代码,关键步骤不是直接对HMAC结果做Base64,而是多了一层特殊转换:
- 生成HMAC SHA256结果(WordArray类型)
- 将该结果隐式转为十六进制字符串(
CryptoJS.enc.Utf8.parse(sig)中,sig默认toString输出十六进制) - 把这个十六进制字符串当作UTF-8文本转成字节
- 最后对这些字节做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
相关产品推荐
相关产品推荐

