如何将此签名方法从crypto(节点)转换为crypto-js(浏览器)?

时间:2018-02-15 17:19:36

标签: javascript node.js cryptojs

我有一个签名方法,意在在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
}

1 个答案:

答案 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
}