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

Javascript crypto.pbkdf2是异步的,如何将其视为同步的?,javascript,node.js,asynchronous,callback,pbkdf2,Javascript,Node.js,Asynchronous,Callback,Pbkdf2,我在node.js中使用pbkdf2对密码进行哈希运算 我的问题是,我对认证请求作出回应,如果通过的证书是正确的,我正处于认证的中间。我假设pbkdf2是异步的,因为它可能需要大量的时间(取决于迭代的大小)。然而,将剩余的身份验证逻辑移动到一个单独的方法中以使用回调似乎有点难看 有没有比使用计时器或将所有连续的身份验证逻辑放入一个单独的函数更好的方法?我知道大多数人会说我应该使用回调,但在我的用例中,这根本没有意义。在将pbkdf2应用于传递的密码之前,我无法继续身份验证。我可以看到两种解决方案

我在node.js中使用pbkdf2对密码进行哈希运算

我的问题是,我对认证请求作出回应,如果通过的证书是正确的,我正处于认证的中间。我假设pbkdf2是异步的,因为它可能需要大量的时间(取决于迭代的大小)。然而,将剩余的身份验证逻辑移动到一个单独的方法中以使用回调似乎有点难看


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

我可以看到两种解决方案

第一种方法是使用一些库来包装异步调用。你可以试试看<代码>节点同步更适合您的需要

第二种解决方案是使用而不是加密:

var bcrypt = require('bcrypt');
var salt = bcrypt.genSaltSync(10);
var hash = bcrypt.hashSync(password, salt);
bcrypt
是节点中用于密码哈希的特殊库。它比内置加密模块更安全,并提供一些有用的方法,如
hashSync
compareSync

根据,PBKDF2函数既有异步版本,也有同步版本

crypto.pbkdf2(密码、salt、迭代、keylen、回调)

异步PBKDF2应用伪随机函数HMAC-SHA1推导 给定密码、salt和迭代中给定长度的密钥。 回调函数获取两个参数
(err,derivedKey)

crypto.pbkdf2Sync(密码、salt、迭代、keylen)

同步PBKDF2函数。返回derivedKey或抛出错误


我认为bcrypt是基于河豚鱼的(根据node.bcrypt.js项目中的维基百科链接)对吗?我使用的pbkdf2的salt大于128位,迭代次数为10000次,afaict是NIST批准的,而河豚bcrypt不是(参考维基百科文章)。我只是好奇你说bcrypt更安全。就我而言,这是最大的问题。没有那么重要,但我想使用最安全的方法。@Metalskin,我做了更多的调查
Bcrypt
在较短的路径短语上更强,但在长度超过55个字符的路径短语上,它开始减弱为
pbkdf2
。但它们都足够安全,因此没有真正的区别。有关更多信息,请参阅。感谢该链接非常有用,我认为我不会超过55个字符,所以使用bcrypt应该没问题。看起来scrypt会更好,但我找不到node.js的任何活动项目。当我说没有真正的区别时,我的意思是实际上不可能取消对pbkdf2哈希字符串的哈希。对于平均大小的密码短语(8个字符),Bcrypt的强度是前者的十倍。但是“十倍不可能”只是一个“不可能”。谢谢凯文,我不知道为什么我去年没有看到。如果它有效的话,这是一个更好的答案,因为这是我真正想要的。当我有机会的时候,我将重温代码并进行测试。第五个参数是摘要。pbkdf2Sync(密码、salt、迭代、keylen、摘要)