繁体   English   中英

Node 的 crypto.pbkdf2() 应该如何工作?

[英]How is Node's crypto.pbkdf2() supposed to work?

我已经多次阅读 Node 加密模块的 pbkdf2() function 的文档。 我之前问的一个问题没有多想就崩溃了 - 所以让我这样说:我认为我对回调缺乏了解 - 但我已经阅读了许多资源试图真正理解它 - YDKJS Async,MDN,“Learning JavaScript ”由奥莱利。

我在回调中的 else 子句中有一个 console.log 语句,它正在适当地记录日志,所以我确定回调正在执行,尽管我的调试程序(在 VSCode 中)没有停止执行。

我尝试了两种不同的方法,如下面的代码所示:一种是在 else 子句中声明一个变量并将其值更改为 derivedKey.toString('hex'),另一种是返回 derivedKey.toString('十六进制')。 都没有奏效。

我尝试链接 then 子句,但 crypto.pbkdf2 返回 void 并且“类型 'void' 上不存在属性 'then'”。

下面是写法:

 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; }

真正归结为:我不知道如何从通过回调返回“void”的 function 中获取 derivedKey.toString('hex') 值。

您的问题是crypto.pbkdf2有点旧,并且不适用于承诺但使用回调。 因此,为了在现代异步代码中使用这个 function ,有必要将 function 包装在Promise

关键思想是在回调中调用 promise 的构造函数给出的resolvereject function。

重构为返回 promise,您的 function 将如下所示:

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'));
            }
        })
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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