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

时间:2013-01-09 13:37:36

标签: javascript node.js asynchronous callback pbkdf2

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

我的问题是我正在响应身份验证请求,而我正在验证传递的凭据是否正确。我假设pbkdf2是异步的,因为它可能需要花费大量时间(取决于迭代的大小)。然而,将剩余的身份验证逻辑移动到一个单独的方法来利用回调似乎有点难看。

是否有比使用定时器或将所有连续认证逻辑抛入单独函数更好的方法?我知道大多数人会说我应该使用回调,但在我的用例中这没有意义。在将pbkdf2应用于传递的密码之前,我无法继续进行身份验证。

2 个答案:

答案 0 :(得分:7)

根据Node.js crypto docs,有一个PBKDF2函数的异步和同步版本。

  

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

     

异步PBKDF2应用伪随机函数HMAC-SHA1来导出   给定密码,盐和迭代的给定长度的键。   回调得到两个参数(err, derivedKey)

     

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

     

同步PBKDF2功能。返回derivedKey或抛出错误。

答案 1 :(得分:6)

我可以看到两个解决方案。

首先是使用一些库来包装异步调用。您可以尝试node-syncnode-promisenode-sync更适合您想要的内容。

第二个解决方案是使用bcrypt而不是crypto:

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

bcrypt是节点中用于密码哈希的特殊库。它比内置加密模块更安全,并提供了一些有用的方法,如hashSynccompareSync