node.js - 从 'crypto' 迁移到 crypto-js 库 : Binary encoding

标签 node.js cryptojs node-crypto

我正在尝试在设备上生成 SHA256 和 HmacSHA512 哈希值,不幸的是,该设备不支持标准 Node crypto 库。所以我正在调整代码以使用 CryptoJS 代替。但是,CryptoJS 无法将哈希编码为二进制(只有 Hex、Base64 和 Latin1 是可用的编码器)。

下面是我尝试迁移的功能。以前的(不可用的)代码已被注释掉。

const getMessageSignature = (path, request, secret, nonce) => {
    // Expected outcome:
    // API-Sign = Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded secret API key
    const message = JSON.stringify(request);

    const secret_buffer = btoa(secret);
    const hash = CryptoJS.algo.SHA256.create();
    const hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, secret_buffer);
    const hash_digest = hash.update(nonce + message).finalize().toString(CryptoJS.enc.Base64);
    const hmac_digest = hmac.update(path + hash_digest).finalize().toString(CryptoJS.enc.Base64);

    // CANNOT USE BELOW (Buffer and crypto not supported)
    // const secret_buffer = new Buffer(secret, 'base64');
    // const hash = new crypto.createHash('sha256');
    // const hmac = new crypto.createHmac('sha512', secret_buffer);
    // const hash_digest = hash.update(nonce + message).digest('binary');
    // const hmac_digest = hmac.update(path + hash_digest, 'binary').digest('base64');

    return hmac_digest;
};

最佳答案

我找到了答案。首先:btoa() 不是必需的,因为 CryptoJS 有自己的功能将 Base64 转换为自己的格式(WordLists):CryptoJS.enc.Base64.parse。接下来是 pathhash_digest 无法正确合并,因为存在类型不匹配(字符串和二进制),因此 JS 使用字符串表示形式。解决方案是首先使用 CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA512, Secret) 创建 SHA512 HMAC,然后使用 hmac 逐步更新每个值.update(值, secret )。最后,您还必须使用 CryptoJS 的内置 Base64 解码器来最终生成签名字符串。

const getMessageSignature = (path, request, secret, nonce) => {
    // API-Sign = Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) and base64 decoded secret API key
    const message = JSON.stringify(request);
    const hash = CryptoJS.SHA256(nonce + message);
    const secret_buffer = CryptoJS.enc.Base64.parse(secret);
    const hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA512, secret_buffer);
    hmac.update(path, secret_buffer);
    hmac.update(hash, secret_buffer);
    return hmac.finalize().toString(CryptoJS.enc.Base64);
};

关于node.js - 从 'crypto' 迁移到 crypto-js 库 : Binary encoding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52523776/

相关文章:

node.js - 有没有办法用 RxJS 管理并发?

node.js - Express.js 中删除 req.body 时为空对象

c# - 加密 QRCode 有效负载,输入长度与输出长度相同

java - 如何使用 Java 从 CryptoJS 解密加密的 AES-256 字符串?

python - python(pycrypto) 和 nodejs(crypto) 之间的加密 (aes-128-cbc) 不匹配

javascript - 如何使用 rsa 公钥验证文件

node.js - 如何在 Node.js 中解密 Triple DES

node.js - 为什么 require ('./' ) 与具有 index.js 的模块内部的 require ('./index' ) 不一样?

multithreading - 如何让node.js中的线程休眠而不影响其他线程?

javascript - CryptoJS,检查 AES 密码是否正确