使用bcrypt确保未重复输入密码

时间:2019-12-23 15:00:48

标签: node.js promise bcrypt

我正在使用bcrypt对数据库中的密码进行哈希处理。我正在尝试添加一项功能,以确保用户何时无法重用密码。我想做的是遍历以前的密码列表以检查是否可重复使用。现在,我可以做一些简单的事情:

var reused = false;
for (let i = 0; i < oldPWs.length; i++) {
   reused = bcrypt.compareSync(newPassword, oldPWs[i].PASSWORD);
   if (reused){
      console.log("Password is a repeat");
      break;
   }
}

但是,根据文档,建议不要使用“同步”功能执行此操作,因为它会阻止其他服务器请求。是否有推荐的方法来检查密码对于哈希列表是否有效?我不认为可以通过bcrypt.compare()函数的回调函数来完成,但是可以通过promises ...提出任何建议。


@Zhephard给了我正确方向的推动,所以我将他的回答标记为正确。我使用的实际代码如下:


var promises = [];
for (let i = 0; i < oldPWs.length; i++) {
    promises.push(bcrypt.compare(newPassword, oldPWs[i].PASSWORD))
}

Promise.all(promises).then((results)=>{
    console.log("All done:", results)
    if (results.includes(true)) {
        // alert users password has been repeated
        console.log("Password is repeat")
    } else {
        // allow password change
        console.log("Password is new")
    }
})

3 个答案:

答案 0 :(得分:0)

根据我在API上阅读的内容,您似乎做对了事情,如果使用诺言是您的选择之一,您可以做类似的事情

oldPWs.map((p) => bcrypt.compare(p.PASSWORD, hash)
  .then((res) => {
    if (res) console.log('Password repeated');
  }));

这种方式很短,您也不必介意在旧的已检索密码之间使用索引

答案 1 :(得分:0)

我相信这就是您想要的。

要做到这一点,您可能会像这样制作一个异步函数

{{1}}

这应该可以实现您的目的。

答案 2 :(得分:0)

您可以在下面尝试。
在没有回调的情况下使用bcrypt.compare()会返回promise。
如果您找到相同的密码,则可以立即等待bcrypt.comapre()和break()。

(async () => {
    for(let i=0 ; oldPWs.length; i++){
        try {
            let isEqual = await bcrypt.compare(newPassword, oldPWs[i].PASSWORD);
            if(isEqual){
                console.log("Password is a repeat");
                break;
            }
        } catch (err) {
            console.error('something wrong');
            console.log(err)
        }
    }
})();