"Error: No callback provided to pbkdf2" when using async await
"Error: No callback provided to pbkdf2" when using async await
我想在 Nodejs 中使用加密模块为 pbkdf2 密码哈希编写一个异步函数。虽然 randomBytes 函数工作正常,但我在 运行 pbkdf2 with await 上得到以下错误:"Error: No callback provided to pbkdf2".
我知道可以使用 pbkdf2Sync() 来解决,但我不明白为什么异步版本不起作用或者等待同步功能是否正确?
节点 v 8.10.0
async function hashPassword(password){
let salt;
let hash;
let pass;
try{
salt = await Crypto.randomBytes(Config.SALT_BYTES);
hash = await Crypto.pbkdf2(password, salt, Config.ITERATIONS, Config.HASH_BYTES, 'sha512');
pass = salt+hash;
return pass;
}
catch(err){
console.log('ERR: ', err);
}
}
Crypto.pbkdf2() 函数有 6 个参数,第 6 个是必需的回调。
如果您想要同步调用,您应该使用 crypto.pbkdf2Sync()。
一个解决方案是将方法包装在一个承诺中。任何需要回调的方法都可以通过这种方式转换成支持async/await的方法
function pbkdf2Async(password, salt, iterations, keylen, digest) {
return new Promise( (res, rej) => {
crypto.pbkdf2(password, salt, iterations, keylen, digest, (err, key) => {
err ? rej(err) : res(key);
});
});
}
util.promisify 添加于:v8.0.0
Takes a function following the common error-first callback style, i.e.
taking an (err, value) => ... callback as the last argument, and
returns a version that returns promises.
const {promisify} = require('util');
const {randomBytes, pbkdf2} = require('crypto');
const randomBytesAsync = promisify(randomBytes);
const pbkdf2Async = promisify(pbkdf2);
async function hashPassword(password, options = {}){
let params = Object.assign({
saltlen: 16,
iterations: 10000,
keylen: 64,
digest: 'sha512'
}, options) // merge default and provided options
const {saltLen, iterations, keylen, digest} = params;
const salt = await randomBytesAsync(saltlen);
const hash = await pbkdf2Async(password, salt, iterations, keylen, digest);
return salt + ':' + hash;
}
Full example with generation password hash and checking password
我想在 Nodejs 中使用加密模块为 pbkdf2 密码哈希编写一个异步函数。虽然 randomBytes 函数工作正常,但我在 运行 pbkdf2 with await 上得到以下错误:"Error: No callback provided to pbkdf2".
我知道可以使用 pbkdf2Sync() 来解决,但我不明白为什么异步版本不起作用或者等待同步功能是否正确?
节点 v 8.10.0
async function hashPassword(password){
let salt;
let hash;
let pass;
try{
salt = await Crypto.randomBytes(Config.SALT_BYTES);
hash = await Crypto.pbkdf2(password, salt, Config.ITERATIONS, Config.HASH_BYTES, 'sha512');
pass = salt+hash;
return pass;
}
catch(err){
console.log('ERR: ', err);
}
}
Crypto.pbkdf2() 函数有 6 个参数,第 6 个是必需的回调。
如果您想要同步调用,您应该使用 crypto.pbkdf2Sync()。
一个解决方案是将方法包装在一个承诺中。任何需要回调的方法都可以通过这种方式转换成支持async/await的方法
function pbkdf2Async(password, salt, iterations, keylen, digest) {
return new Promise( (res, rej) => {
crypto.pbkdf2(password, salt, iterations, keylen, digest, (err, key) => {
err ? rej(err) : res(key);
});
});
}
util.promisify 添加于:v8.0.0
Takes a function following the common error-first callback style, i.e. taking an (err, value) => ... callback as the last argument, and returns a version that returns promises.
const {promisify} = require('util');
const {randomBytes, pbkdf2} = require('crypto');
const randomBytesAsync = promisify(randomBytes);
const pbkdf2Async = promisify(pbkdf2);
async function hashPassword(password, options = {}){
let params = Object.assign({
saltlen: 16,
iterations: 10000,
keylen: 64,
digest: 'sha512'
}, options) // merge default and provided options
const {saltLen, iterations, keylen, digest} = params;
const salt = await randomBytesAsync(saltlen);
const hash = await pbkdf2Async(password, salt, iterations, keylen, digest);
return salt + ':' + hash;
}
Full example with generation password hash and checking password