![](/img/trans.png)
[英]Node.js crypto.pbkdf2Sync password does not match with python script
[英]Digest string NOT WORKING crypto.pbkdf2Sync
我正在尝试更新曾经在节点 4.5 上运行的旧应用程序的身份验证系统,但每次尝试登录时都会收到此错误。
TypeError [ERR_INVALID_ARG_TYPE]: The "digest" argument must be one of type string or null. Received type undefined
at check (internal/crypto/pbkdf2.js:56:13)
这是我试图解决的问题
旧版本的代码是:
crypto.pbkdf2Sync(password, new Buffer(this.salt, 'base64'), 10000, 64).toString('base64');
我正在尝试更新到这一点:
pbkdf2Sync(password, new Buffer(this.salt, 'base64'), 10000, 64,'sha512').toString('base64');
但是,这不起作用,因为先前存储的散列密码与我实施的更新创建的散列不匹配。
关于我能做什么的任何建议?
我建议将“sha1”作为摘要参数传递,因为这是在未包含摘要参数时使用的摘要 - 来自文档:
应用由摘要指定的选定 HMAC 摘要算法以从密码、盐和迭代中导出请求字节长度的密钥 (keylen)。 如果未指定摘要算法,则使用默认值“sha1”。
因此,如果我们明确地将“sha1”作为摘要传递,我们应该得到所需的结果:
crypto.pbkdf2Sync(password, Buffer.from(this.salt, 'base64'), 10000, 64, "sha1").toString('base64');
下面的代码在使用 Node 12.16.1 的在线编译器上运行,没有任何错误。 它是另一个项目的一部分,因此在那里提供了一些额外的信息。
output:
Generate a 32 byte long AES key with PBKDF2
aesKeySha256 length: 32 data: e1ea3e4b0376c0f9bf93b94fe71719a099317297b79108aacd88c8a355d7a3d4
aesKeySha1 length: 32 data: d6bc1ae2aea28f5098826b555d7a0fe073e5bc7d8136d232e01d422ba2dd761e
aesKeySha1 Base64: 1rwa4q6ij1CYgmtVXXoP4HPlvH2BNtIy4B1CK6Lddh4=
安全警告以下代码使用固定盐 - 对于生产,每次运行使用随机生成的盐:
console.log("Generate a 32 byte long AES key with PBKDF2");
var crypto = require('crypto');
var password = "secret password";
var PBKDF2_ITERATIONS = 15000; // number of iterations, higher is better but slower
// ### security warning - never use a fixed salt in production, this is for compare reasons only
var salt = generateFixedSalt32Byte();
// please use below generateSalt32Byte()
//var salt = generateSalt32Byte();
var aesKeySha256 = generateAes256KeyPbkdf2Sha256(password, PBKDF2_ITERATIONS, salt);
console.log('aesKeySha256 length: ',
aesKeySha256.length, ' data: ', bytesToHex(aesKeySha256));
var aesKeySha1 = generateAes256KeyPbkdf2Sha1(password, PBKDF2_ITERATIONS, salt);
console.log('aesKeySha1 length: ',
aesKeySha1.length, ' data: ', bytesToHex(aesKeySha1));
var aesKeySha1Base64 = generateAes256KeyPbkdf2Sha1Base64(password, PBKDF2_ITERATIONS, salt);
console.log('aesKeySha1 Base64: ', aesKeySha1Base64);
function generateAes256KeyPbkdf2Sha256(password, iterations, salt) {
return crypto.pbkdf2Sync(password, salt, iterations, 32, 'sha256');
}
function generateAes256KeyPbkdf2Sha1(password, iterations, salt) {
return crypto.pbkdf2Sync(password, salt, iterations, 32, 'sha1');
}
function generateAes256KeyPbkdf2Sha1Base64(password, iterations, salt) {
return crypto.pbkdf2Sync(password, salt, iterations, 32, 'sha1').toString('base64');
}
function generateSalt32Byte() {
return crypto.randomBytes(32);
}
function generateFixedSalt32Byte() {
return Buffer.from('0000000000000000000000000000000000000000000000000000000000000000', 'hex');
}
function bytesToHex(input) {
return input.toString('hex');
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.