Suj*_*uji 6 javascript bcrypt node.js
我正在创建一个用户登录。我可以让用户注册,当用户注册时,他的密码在保存到数据库之前被加密。
当同一用户尝试登录时,我收到“无效密码”。
这是因为它将用户输入与数据库中的加密密码进行比较。例如,如果密码是 1234,那么在数据库中它被保存为“$2a$104$0301”。当用户尝试登录时,将用户输入“1234”与“2a$104$0301”进行比较。我该如何解决?
这是我的登录代码:
var LocalStrategy = require('passport-local').Strategy;
var User = require('../Models/users.js');
var bcrypt = require('bcrypt-nodejs');
module.exports = function(passport){
passport.use('login', new LocalStrategy({
passReqToCallback : true
},
function(req, username, password, done){
User.findOne({'username' : username},
function(err, user){
if(err)
return done(err);
if(!user){
console.log('User Not Found with username: '+username);
return done(null, false,
req.flash('message', 'User Not Found.'));
}
if (!isValidPassword(user, password)){
console.log('Invalid Password');
return done (null, false,
req.flash('message', 'Invalid Password'));
}
return done(null, user);
}
);
})
);
var isValidPassword = function(user, password){
var result = bcrypt.compareSync(password, user.password);
if (result) {
console.log("Password correct");
} else {
console.log("Password wrong");
}
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
compareSync方法只接受 2 个参数并返回一个布尔值trueor false。
您应该像这样执行检查:
var result = bcrypt.compareSync(password, user.password);
if (result) {
console.log("Password correct");
} else {
console.log("Password wrong");
}
Run Code Online (Sandbox Code Playgroud)
小智 5
聚会真的很晚了,但是我遇到了同样的问题,它对我不起作用的原因是我在尝试与已经加密的“user.password”进行比较之前已经对输入密码进行了加密。
当我意识到不需要加密输入密码时,compareSync 就完美地工作了。
来自bcrypt - npm:
要检查密码:
// Load hash from your password DB.
bcrypt.compareSync(myPlaintextPassword, hash); // true
bcrypt.compareSync(someOtherPlaintextPassword, hash); // false
Run Code Online (Sandbox Code Playgroud)
“compareSync”函数可以对抗定时攻击(使用所谓的“恒定时间”算法)。一般来说,如果密码、加密密钥或加密哈希与安全相关,请勿使用普通的 JavaScript 字符串比较函数来比较它们。
| 归档时间: |
|
| 查看次数: |
22310 次 |
| 最近记录: |