Node.js 使用bcrypt确保密码没有';没有重复过
我正在使用哈希在数据库中的密码。我正在尝试添加一项功能,以确保用户无法重用密码。我想做的是循环查看以前的密码列表,以检查是否重复使用。现在我可以做一些简单的事情,比如:Node.js 使用bcrypt确保密码没有';没有重复过,node.js,promise,bcrypt,Node.js,Promise,Bcrypt,我正在使用哈希在数据库中的密码。我正在尝试添加一项功能,以确保用户无法重用密码。我想做的是循环查看以前的密码列表,以检查是否重复使用。现在我可以做一些简单的事情,比如: var reused = false; for (let i = 0; i < oldPWs.length; i++) { reused = bcrypt.compareSync(newPassword, oldPWs[i].PASSWORD); if (reused){ console.log("
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;
}
}
根据我在API上读到的,你似乎做了正确的事情,如果使用承诺是你的选择之一,你可以这样做
oldPWs.map((p)=>bcrypt.compare(p.PASSWORD,hash)
。然后((res)=>{
if(res)console.log(“重复密码”);
}));
这种方法非常简单,您也不必介意在旧的检索密码中使用索引根据我在API上读到的内容,您似乎做了正确的事情,如果使用承诺是您的选择之一,您可以这样做
oldPWs.map((p)=>bcrypt.compare(p.PASSWORD,hash)
。然后((res)=>{
if(res)console.log(“重复密码”);
}));
这种方法非常简单,您不必介意在旧的检索密码中使用索引我相信这就是您想要的 要做到这一点,您可能需要创建这样一个异步函数
//Non blocking bcrypt
async function reuse_check(plaintext, oldPw) {
var promise = new Promise(function (res, rej){
bcrypt.compare(plaintext, oldPw, function(err, BCRYPT_RES){
if(err){
console.log(err)
}
else {
if (BCRYPT_RES) {
res(true)
}
else {
res(false)
}
}
})
})
let isReused = await promise
return isReused
}
//Loops, await is valid in async only
async function looper(plaintext, oldPwsArray) {
var reused = false
for (let i = 0; i < oldPwsArray.length; i++) {
var temp = await reuse_check(plaintext, oldPwsArray[i])
if (temp) {
reused = true
break
}
else {
}
}
if (reused) {
console.log("Reused")
}
}
//Driver
looper(plaintext, oldPwsArray)
//非阻塞bcrypt
异步函数重用检查(明文、oldPw){
var承诺=新承诺(功能(res,rej){
比较(纯文本、oldPw、函数(err、bcrypt_RES){
如果(错误){
console.log(错误)
}
否则{
如果(BCRYPT_RES){
res(真实)
}
否则{
res(假)
}
}
})
})
让我们等待承诺
返回已调整
}
//循环、等待仅在异步中有效
异步函数循环器(明文、oldPwsArray){
var=false
for(设i=0;i
这应该能达到你的目的 我相信这就是你想要的 要做到这一点,您可能需要创建这样一个异步函数
//Non blocking bcrypt
async function reuse_check(plaintext, oldPw) {
var promise = new Promise(function (res, rej){
bcrypt.compare(plaintext, oldPw, function(err, BCRYPT_RES){
if(err){
console.log(err)
}
else {
if (BCRYPT_RES) {
res(true)
}
else {
res(false)
}
}
})
})
let isReused = await promise
return isReused
}
//Loops, await is valid in async only
async function looper(plaintext, oldPwsArray) {
var reused = false
for (let i = 0; i < oldPwsArray.length; i++) {
var temp = await reuse_check(plaintext, oldPwsArray[i])
if (temp) {
reused = true
break
}
else {
}
}
if (reused) {
console.log("Reused")
}
}
//Driver
looper(plaintext, oldPwsArray)
//非阻塞bcrypt
异步函数重用检查(明文、oldPw){
var承诺=新承诺(功能(res,rej){
比较(纯文本、oldPw、函数(err、bcrypt_RES){
如果(错误){
console.log(错误)
}
否则{
如果(BCRYPT_RES){
res(真实)
}
否则{
res(假)
}
}
})
})
让我们等待承诺
返回已调整
}
//循环、等待仅在异步中有效
异步函数循环器(明文、oldPwsArray){
var=false
for(设i=0;i
这应该能达到你的目的 您可以在下面尝试。在没有回调的情况下使用bcrypt.compare()将返回承诺。
如果找到相同的密码,可以立即等待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)
}
}
})();
您可以在下面尝试。在没有回调的情况下使用bcrypt.compare()将返回承诺。
如果找到相同的密码,可以立即等待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)
}
}
})();
旧密码的列表来自哪里?如果它在数据库中,您可以在那里进行比较吗?因此,请改用异步
bcrypt.compare()
?除了“阻塞”问题外,还有一个问题,即计算bcrypt哈希值需要大约250毫秒的CPU时间。这意味着,为了检查用户没有试图重复使用他们最后9个密码中的一个,需要2250毫秒的纯CPU时间。这不是一件好事。真正的问题是防止旧密码重用的密码策略。摆脱那个政策,让系统更安全。@IanBoyd我很困惑。。。防止密码重复使用的策略难道不会比允许用户继续重复使用密码更安全吗?它会强制用户使用较弱的密码,这样他们就可以记住它们,因为他们不能使用他们想使用的密码。旧密码列表从何而来?如果它在数据库中,您可以在那里进行比较吗?因此,请改用异步bcrypt.compare()
?除了“阻塞”问题外,还有一个问题,即计算bcrypt哈希值需要大约250毫秒的CPU时间。这意味着,为了检查用户没有试图重复使用他们最后9个密码中的一个,需要2250毫秒的纯CPU时间。这不是一件好事。真正的问题是防止旧密码重用的密码策略。摆脱那个政策,让系统更安全。@IanBoyd我很困惑。。。防止密码重复使用的策略难道不会比允许用户继续重复使用密码更安全吗?它会强制用户使用较弱的密码,这样他们就可以记住它们,因为他们不能使用他们想要使用的密码。我可以用你的答案来帮助解决我的问题。我切换到Promissions,但在允许用户更改密码之前,我必须运行所有Promissions。我可以使用您的答案帮助解决我的问题。我切换到Promissions,但在允许用户更改密码之前,我必须运行所有Promissions。