首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >HmacSHA1在节点加密和CryptoJS中的不同结果

HmacSHA1在节点加密和CryptoJS中的不同结果
EN

Stack Overflow用户
提问于 2020-05-18 18:38:04
回答 1查看 1.4K关注 0票数 1

从NativeScript开始,我在一个这一实现应用程序中使用Google实现两个因素身份验证。由于Node的密码模块不能在NativeScript中运行,所以我试图让它与CryptoJS一起工作。

这是工作节点代码。函数返回一个具有正确值的缓冲区。

代码语言:javascript
复制
const crypto = require('crypto');

function generateHOTP(secret, counter) {
    const buffer = Buffer.alloc(8);
    for (let i = 0; i < 8; i++) {
       buffer[7 - i] = counter & 0xff;
       counter = counter >> 8;
    }

    const hmac = crypto.createHmac('sha1', secret);
    hmac.update(buffer);
    return hmac.digest();
}

这是CryptoJS的等价物。返回的值与前一个函数不同,有时它在许多迭代中返回相同的值,而不管输入如何。

代码语言:javascript
复制
const CryptoJS = require("crypto-js");

function generateHOTP(secret, counter) {
    const buffer = Buffer.alloc(8);
    for (let i = 0; i < 8; i++) {
       buffer[7 - i] = counter & 0xff;
       counter = counter >> 8;
    }

    let result = CryptoJS.HmacSHA1(buffer.toString(), secret); // buffer.toString() is the problem
    return Buffer.from(result.toString(), "hex");
}

如果在第一个函数中,我将hmac.update(buffer)更改为hmac.update(buffer.toString()),它将返回与第二个函数相同的错误值,因此问题在于字符串转换。buffer是UInt8Array。

如何修正CryptoJS.HmacSHA1(message, key)的第一个参数以返回与第一个函数相同的值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-18 19:03:05

您为密码模块提供了一个缓冲区,而给CryptoJS提供了一个字符串。可能他们不像缓冲区那样处理字符串。CryptoJS不支持作为输入的缓冲区,只支持字符串和WordArray,因此诀窍是将缓冲区转换为WordArray:

更改以下行:

代码语言:javascript
复制
let result = CryptoJS.HmacSHA1(buffer.toString(), secret);

至:

代码语言:javascript
复制
let result = CryptoJS.HmacSHA1(CryptoJS.lib.WordArray.create(buffer), secret);

如果您希望代码更符合密码版本(CryptoJS有类似的接口):

代码语言:javascript
复制
const CryptoJS = require("crypto-js");

function generateHOTP(secret, counter) {
    const buffer = Buffer.alloc(8);
    for (let i = 0; i < 8; i++) {
        buffer[7 - i] = counter & 0xff;
        counter = counter >> 8;
    }

    const hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA1, secret);
    hmac.update(CryptoJS.lib.WordArray.create(buffer))
    return Buffer.from(hmac.finalize().toString(), 'hex');
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61876649

复制
相关文章

相似问题

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