我正在使用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")
}
})
答案 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)
}
}
})();