javascript - goog.cryp.Hmac 无法从节点 js 的 crypt 重现结果
问题描述
我正在尝试重现此处描述的 HMAC 签名。
该示例使用crypt
from nodejs
,但是,就我而言,我需要使用 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
.
这是我的问题:
- 我不确定是否
goog_crypto
正确实施。 - 为什么
hash.String()
返回一个类似数组的东西? - 如何使用闭包库将 hmac 哈希转换为 base64 字符串。
解决方案
- 您的 goog_crypto 函数看起来是正确的,因为结果是相同的,尽管它表示为 base64 与整数数组(字节)
- 的返回值
getHmac
,即hash
在您的代码中,是一个整数数组 - 如此处所述...... anarray.toString()
与array.join()
- 如果您希望您的 goog_crypto 函数返回 base64,请使用 nodejs Buffer toString 为您完成艰苦的工作
IE
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');
}
由于hash
是 的数组Numbers
,Buffer.from(hash)
因此从 in 的数字创建一个 Buffer 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)
推荐阅读
- java - 插入二叉树问题的方法
- javascript - Match string with 10 or fewer non-whitespace characters in front of string, ignoring whitespace characters
- rvest - Rvest 返回零列表
- c# - 为什么可以将地址添加到 MailMessage.To 使用对象初始化?
- static-analysis - 单个文件上的 Spotbugs?
- swift - 调用localizedNetworkReachabilityStatusString 后的未知状态
- c - 如何将字符串和变量连接到C中的字符串
- java - Java - 在二维字符数组中搜索单词?
- javascript - 如何找到与提供的 slug 匹配的某个对象的索引
- android - 使用 cordova-plugin-firebase-messaging 显示来自 Ionic 的通知