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

Met*_*kin 6 javascript asynchronous callback pbkdf2 node.js

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

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

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

Kev*_*son 7

根据Node.js加密文档,有一个PBKDF2函数的异步和同步版本.

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

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

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

同步PBKDF2功能.返回derivedKey或throws错误.


Leo*_*tny 6

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

第一个是使用一些库来包装异步调用.您可以尝试node-syncnode-promise.node-sync更适合你想要的东西.

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

var bcrypt = require('bcrypt');
var salt = bcrypt.genSaltSync(10);
var hash = bcrypt.hashSync(password, salt);
Run Code Online (Sandbox Code Playgroud)

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

  • 当我说没有真正的区别时,我的意思是实际上不可能取消 pbkdf2 哈希字符串的哈希值。对于平均大小的密码短语(8 个字符),Bcrypt 的强度要高出十倍。但“十次不可能”只是“不可能”。 (2认同)