我有一个签名方法,意在在Node.js中使用,但我想在客户端使用crypto-js实现它。它应该适用于最新的Chrome版本。
我试图遵循这样的答案:Decode a Base64 String using CryptoJS
但我得到的错误包括"错误:格式错误的UTF-8数据"或者与预期的hmacDigest不同的结果。
我不确定如何找到"二进制"的替代品。摘要虽然我发现了这个问题: How to get digest representation of CryptoJS.HmacSHA256 in JS
该方法应该回答以下问题:
"消息签名使用HMAC-SHA512(URI路径+ SHA256(nonce + POST数据))和base64解码的秘密API密钥"
这是Nodejs版本(带加密):
const crypto = require('crypto')
function sign(path, params, secret) {
const message = querystring.stringify(params)
const secretBase64 = Buffer.from(secret, 'base64')
const hash = crypto.createHash('sha256')
const hmac = crypto.createHmac('sha512', secretBase64)
const hashDigest = hash.update(params.nonce + message).digest('binary')
const hmacDigest = hmac.update(path + hashDigest, 'binary').digest('base64')
return hmacDigest
}
注意:querystring只是一个也可以在浏览器中运行的辅助模块:https://nodejs.org/api/querystring.html
这是我用crypto-js实现的尝试(wip):
import cryptojs from 'crypto-js')
function sign (path, params, secret) {
const message = querystring.stringify(params)
const secretParsed = cryptojs.enc.Base64.parse(secret)
const secretDecoded = cryptojs.enc.Utf8.stringify(secretParsed) // -> this throws an error as "Error: Malformed UTF-8 data"
const hash = cryptojs.SHA256(params.nonce + message).toString(cryptojs.enc.hex)
const hmac = cryptojs.HmacSHA512(path + hash, secretDecoded).toString(cryptojs.enc.hex)
return hmac
}
答案 0 :(得分:0)
试试这个!我想这就是你要找的!
const crypto = require("crypto")
const sign = (path, params, secret) => {
const message = querystring.stringify(params)
const secret = Buffer.from(secret, 'base64')
let sign = params.nonce + message
let hash = crypto.createHmac('sha256', secret)
.update(sign)
.digest("base64").toString()
let encoded = encodeURIComponent(hash)
return encoded
}