节点bCrypt.compareSync

时间:2015-01-02 22:51:10

标签: javascript node.js bcrypt

我正在创建用户登录信息。我可以让用户注册,当用户唱出密码时,密码会在保存到数据库中之前加密。

当同一个用户尝试登录时,我收到一个"无效的密码"。

这是因为它将用户输入与数据库中的加密密码进行比较。密码为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;

 }
}

3 个答案:

答案 0 :(得分:2)

compareSync方法只接受2个参数,并返回布尔值truefalse

你应该像这样执行检查:

var result = bcrypt.compareSync(password, user.password);
if (result) {
    console.log("Password correct");
} else {
    console.log("Password wrong");
}

答案 1 :(得分:0)

参加聚会真的很晚,但是我也遇到了同样的问题,对我不起作用的原因是,在尝试与已经加密的“ user.password”进行比较之前,我已经加密了输入密码。 >

一旦我意识到不需要加密输入密码,则compareSync会完美运行。

来自bcrypt - npm

要检查密码:

// Load hash from your password DB.
bcrypt.compareSync(myPlaintextPassword, hash); // true
bcrypt.compareSync(someOtherPlaintextPassword, hash); // false

“ compareSync”功能可抵抗定时攻击(使用所谓的“恒定时间”算法)。通常,如果它们与安全性相关,请不要使用常规的JavaScript字符串比较功能来比较密码,加密密钥或加密哈希。

答案 2 :(得分:0)

我遇到了类似的问题,在执行 bcrypt.compareSync 时,它没有对没有 bcrypt 的用户的密码进行哈希处理,问题是我拥有它们的顺序,如下所示:

bcrypt.compareSync (passwordHash, password)

我通过组织它来解决它,首先是密码,然后是密码哈希,它看起来像这样: bcrypt.compareSync (password, student.password)

我希望它对某人有帮助,很好的代码! <3 @sebasrestrepom