Node 的 crypto.pbkdf2() 应该如何工作?
How is Node's crypto.pbkdf2() supposed to work?
我已经多次阅读有关 Node 加密模块的 pbkdf2() 函数的文档。我之前问的一个问题没有多想就被折叠了 - 所以让我这样说:我认为我对回调缺乏理解 - 但我已经阅读了很多资源试图真正理解它 - YDKJS Async,MDN,"Learning JavaScript" 作者:O'Reilly。
我在适当记录回调的 else 子句中有一个 console.log 语句,所以我确定正在执行回调,尽管我的调试程序(在 VSCode 中)不会停止执行。
我尝试了两种不同的方法,如下面的代码所示:一种是在 else 子句中声明一个变量并将其值更改为 derivedKey.toString('hex'),另一种是到 return derivedKey.toString('hex')。都没有用。
我尝试链接一个 then 子句,但是 crypto.pbkdf2 returns void 和 "property 'then' does not exist on type 'void'".
这里是写法:
private static async hashPassword(password:string, salt:string):Promise<string> {
var hashedPassword;
const iterations = 50000;
const keylen = 64;
const digest = 'sha512';
const possibleReturnedValue = await crypto.pbkdf2(password, salt, iterations, keylen, digest, (err, derivedKey) => {
if (err) {throw err;}
else {
console.log(derivedKey.toString('hex'));
console.log("Hey now");
hashedPassword = derivedKey.toString('hex');
return derivedKey.toString('hex');
}
})
return hashedPassword;
}
真正归结为:我不知道如何从 returns [=34] 的函数中获取 derivedKey.toString('hex') 值=] 与回调。
你的问题是 crypto.pbkdf2
函数有点旧,不能使用 promises 但使用回调。因此,为了在现代异步代码中使用此函数,有必要将该函数包装在 Promise
对象中。
关键思想是在回调中调用由 promise 的构造函数提供的 resolve
和 reject
函数。
重构为 return 一个承诺,您的函数将如下所示:
function hashPassword(password:string, salt:string):Promise<string> {
return new Promise((resolve, reject) => {
const iterations = 50000;
const keylen = 64;
const digest = 'sha512';
crypto.pbkdf2(password, salt, iterations, keylen, digest, (err, key) => {
if (err) {
reject(err);
} else {
resolve(key.toString('hex'));
}
})
});
}
我已经多次阅读有关 Node 加密模块的 pbkdf2() 函数的文档。我之前问的一个问题没有多想就被折叠了 - 所以让我这样说:我认为我对回调缺乏理解 - 但我已经阅读了很多资源试图真正理解它 - YDKJS Async,MDN,"Learning JavaScript" 作者:O'Reilly。
我在适当记录回调的 else 子句中有一个 console.log 语句,所以我确定正在执行回调,尽管我的调试程序(在 VSCode 中)不会停止执行。
我尝试了两种不同的方法,如下面的代码所示:一种是在 else 子句中声明一个变量并将其值更改为 derivedKey.toString('hex'),另一种是到 return derivedKey.toString('hex')。都没有用。
我尝试链接一个 then 子句,但是 crypto.pbkdf2 returns void 和 "property 'then' does not exist on type 'void'".
这里是写法:
private static async hashPassword(password:string, salt:string):Promise<string> {
var hashedPassword;
const iterations = 50000;
const keylen = 64;
const digest = 'sha512';
const possibleReturnedValue = await crypto.pbkdf2(password, salt, iterations, keylen, digest, (err, derivedKey) => {
if (err) {throw err;}
else {
console.log(derivedKey.toString('hex'));
console.log("Hey now");
hashedPassword = derivedKey.toString('hex');
return derivedKey.toString('hex');
}
})
return hashedPassword;
}
真正归结为:我不知道如何从 returns [=34] 的函数中获取 derivedKey.toString('hex') 值=] 与回调。
你的问题是 crypto.pbkdf2
函数有点旧,不能使用 promises 但使用回调。因此,为了在现代异步代码中使用此函数,有必要将该函数包装在 Promise
对象中。
关键思想是在回调中调用由 promise 的构造函数提供的 resolve
和 reject
函数。
重构为 return 一个承诺,您的函数将如下所示:
function hashPassword(password:string, salt:string):Promise<string> {
return new Promise((resolve, reject) => {
const iterations = 50000;
const keylen = 64;
const digest = 'sha512';
crypto.pbkdf2(password, salt, iterations, keylen, digest, (err, key) => {
if (err) {
reject(err);
} else {
resolve(key.toString('hex'));
}
})
});
}