从NativeScript开始,我在一个这一实现应用程序中使用Google实现两个因素身份验证。由于Node的密码模块不能在NativeScript中运行,所以我试图让它与CryptoJS一起工作。
这是工作节点代码。函数返回一个具有正确值的缓冲区。
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的等价物。返回的值与前一个函数不同,有时它在许多迭代中返回相同的值,而不管输入如何。
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)
的第一个参数以返回与第一个函数相同的值?
发布于 2020-05-18 19:03:05
您为密码模块提供了一个缓冲区,而给CryptoJS提供了一个字符串。可能他们不像缓冲区那样处理字符串。CryptoJS不支持作为输入的缓冲区,只支持字符串和WordArray,因此诀窍是将缓冲区转换为WordArray:
更改以下行:
let result = CryptoJS.HmacSHA1(buffer.toString(), secret);
至:
let result = CryptoJS.HmacSHA1(CryptoJS.lib.WordArray.create(buffer), secret);
如果您希望代码更符合密码版本(CryptoJS有类似的接口):
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');
}
https://stackoverflow.com/questions/61876649
复制相似问题