繁体   English   中英

摘要字符串不工作 crypto.pbkdf2Sync

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM