首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >goog.cryp.Hmac不能再现节点js的加密结果。

goog.cryp.Hmac不能再现节点js的加密结果。
EN

Stack Overflow用户
提问于 2019-10-10 06:08:03
回答 1查看 62关注 0票数 1

我试图复制HMAC签名描述的这里

这个例子是使用来自nodejsnodejs,但是在我的例子中,我需要使用Google闭包库。因此,我尝试使用goog.crypt.Hmac库复制HMAC签名。

下面是我的实验代码。

代码语言:javascript
复制
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字符串。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-10 06:30:06

  1. 您的goog_crypto函数看起来是对的,因为结果是相同的,尽管用base64和整数数组(字节)表示。
  2. getHmac的返回值,即代码中的hash,是整数的数组-作为记录在这里 .array.toString()array.join()非常相似。
  3. 如果您希望goog_crypto函数返回base64,请使用nodejs缓冲区toString为您做艰苦的工作。

i.e

代码语言:javascript
复制
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编码的缓冲区数据。

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

代码语言:javascript
复制
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)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58316424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档