crypto.pbkdf2是asynchronous的,我如何将其视为同步?

我在node.js中使用pbkdf2来散列密码。

我的问题是,我正在响应身份validation请求,我正在进行身份validation,如果传递的凭据是正确的。 我假设pbkdf2是asynchronous的,因为它可能需要大量的时间(取决于迭代的大小)。 然而,将剩余的authentication逻辑转移到一个单独的方法来利用callback看起来有点难看。

有没有比使用计时器或将所有连续validation逻辑放入单独函数更好的方法? 我知道大多数人会说我应该使用callback,但在我的使用情况下,这是没有道理的。 直到我将pbkdf2应用到传递的密码之后,我才能继续进行身份validation。

我可以看到你的问题的两个解决scheme。

首先是使用一些库来包装asynchronous调用。 您可以尝试节点同步或节点承诺 。 node-sync更适合你想要的。

第二种解决scheme是使用bcrypt而不是crypto:

 var bcrypt = require('bcrypt'); var salt = bcrypt.genSaltSync(10); var hash = bcrypt.hashSync(password, salt); 

bcrypt是在节点中用于密码散列的特殊库。 它更安全,然后内置encryption模块,并提供一些有用的方法,如hashSynccompareSync

根据Node.jsencryption文档 ,PBKDF2函数既有asynchronous版本也有同步版本。

crypto.pbkdf2(密码,盐,迭代,keylen,callback)

asynchronousPBKDF2使用伪随机函数HMAC-SHA1从给定密码,盐和迭代中导出给定长度的密钥。 callback得到两个参数(err, derivedKey)

crypto.pbkdf2Sync(密码,盐,迭代,keylen)

同步PBKDF2function。 返回derivedKey或抛出错误。