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模块,并提供一些有用的方法,如hashSync
和compareSync
。
根据Node.jsencryption文档 ,PBKDF2函数既有asynchronous版本也有同步版本。
crypto.pbkdf2(密码,盐,迭代,keylen,callback)
asynchronousPBKDF2使用伪随机函数HMAC-SHA1从给定密码,盐和迭代中导出给定长度的密钥。 callback得到两个参数
(err, derivedKey)
。crypto.pbkdf2Sync(密码,盐,迭代,keylen)
同步PBKDF2function。 返回derivedKey或抛出错误。