gpt4 book ai didi

javascript - goog.cryp.Hmac 无法从 Node js 的 crypt 重现结果

转载 作者:行者123 更新时间:2023-11-30 19:12:42 25 4
gpt4 key购买 nike

我正在尝试重现描述的 HMAC 签名 here .

该示例使用 nodejs 中的 crypt,但是,就我而言,我需要使用 google 闭包库。所以我尝试使用 goog.crypt.Hmac 库重现 HMAC 签名。

下面是我的实验代码。

let crypto = require('crypto');
require("google-closure-library");

goog.require("goog.crypt.Hmac");
goog.require("goog.crypt");
goog.require('goog.crypt.Sha1');

function forceUnicodeEncoding(string) {
return decodeURIComponent(encodeURIComponent(string));
}

function nodejs_crypto(string_to_sign, secret) {
signature = crypto.createHmac('sha1', secret)
.update(forceUnicodeEncoding(string_to_sign))
.digest('base64')
.trim();
return signature
}

function goog_crypto(string_to_sign, secret) {
const hmac = new goog.crypt.Hmac(new goog.crypt.Sha1(), goog.crypt.stringToByteArray(secret));
const hash = hmac.getHmac(forceUnicodeEncoding(string_to_sign));
return hash.toString()
}

const string_to_sign = "message";
const secret = "secret";
const sig1 = nodejs_crypto(string_to_sign, secret);
const sig2 = goog_crypto(string_to_sign, secret);

console.log(sig1);
// DK9kn+7klT2Hv5A6wRdsReAo3xY=

console.log(sig2);
// 12,175,100,159,238,228,149,61,135,191,144,58,193,23,108,69,224,40,223,22

我很难在网上找到任何关于 goog.crypt.Hmac 的例子。

这是我的问题:

  1. 我不确定 goog_crypto 是否正确实现。
  2. 为什么 hash.String() 返回一个类似数组的东西?
  3. 如何使用闭包库将 hmac 哈希转换为 base64 字符串。

最佳答案

  1. 你的 goog_crypto 函数看起来是正确的,因为结果是相同的,尽管是用 base64 和整数数组(字节)表示
  2. getHmac 的返回值,即 hash在您的代码中,是一个整数数组 - 如 documented here ...一个array.toString()array.join() 大致相同
  3. 如果您希望 goog_crypto 函数返回 base64,请使用 nodejs Buffer toString 为您完成艰苦的工作

function goog_crypto(string_to_sign, secret) {
const hmac = new goog.crypt.Hmac(new goog.crypt.Sha1(), goog.crypt.stringToByteArray(secret));
const hash = hmac.getHmac(forceUnicodeEncoding(string_to_sign));
return Buffer.from(hash).toString('base64');
}

hashNumbers 的数组, Buffer.from(hash)hash 中的数字创建一个缓冲区- buffer.toString('base64')返回以 base64 格式编码

的缓冲区数据

关于第 1 点:证明您在代码中获得的结果是相同的

const sig1 = "DK9kn+7klT2Hv5A6wRdsReAo3xY=";
const sig2 = '12,175,100,159,238,228,149,61,135,191,144,58,193,23,108,69,224,40,223,22';
const sig1AsNumArrayString = atob(sig1).split('').map(c => c.charCodeAt(0)).toString();
console.log(sig2 === sig1AsNumArrayString)

关于javascript - goog.cryp.Hmac 无法从 Node js 的 crypt 重现结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58316424/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com