节点bcrypt的比较总是返回false

cmc*_*mcd 8 javascript bcrypt node.js

我很困难,试图让我的密码成功地与使用节点的bcrypt进行比较.也许我错过了一些东西,但在创建帐户时,我在注册方法中执行以下操作(某些代码缩写):

bcrypt.genSalt(10, function(err, salt) {
               if(err) {

               }
               bcrypt.hash(user.Password, salt, function(err, hash) {
                           console.log('hashing and saving');
                           db.query(db insert code, function (error, rows, fields) {
                                    if(error) {
                                    console.log(error);
                                    res.setHeader('500', { 'Content-Type': 'x-application/json'});
                                    res.send({UserId: 0, ErrorMessage: 'Something terrible happened.'});
                                    } else {
                                    console.log('User created : ' + rows.insertId);
                                    res.setHeader('200', { 'Content-Type': 'x-application/json'});
                                    res.send({UserId: rows.insertId});
                                    }
                                    });
                           });
               });

return next();
Run Code Online (Sandbox Code Playgroud)

一切正常.我的数据库有加密密码.但是当用户登录时,我无法从bcrypt.compare获得成功结果:

db.query(get account code, function(error, rows, fields) {
         if(rows.length == 1) {
           bcrypt.compare(request.params.password, rows[0].Password, function(err,res) {
              if(err) { console.log(err.toString()); }
              if(res == true)
              {
                        response.setHeader('200', { 'Content-Type': 'x-application/json' });
                        response.send({result: true});
              } else {
                        response.setHeader('401', { 'Content-Type': 'x-application/json' });
                        console.log('invalid password');
                        response.send({result:false});
                     }
              });
         }
        });

return next();
Run Code Online (Sandbox Code Playgroud)

我总是以无效密码结束.在比较我从数据库中取出的内容之前,是否需要使用明文密码并重新加密?

Was*_*lam 13

bcrypt 的比较方法的参数应该是

bcrypt.compare(actual_password, encrypted_password)

代替

bcrypt.compare(encrypted_password, actual_password)

=> 加密密码应该是第二个参数。

  • 虽然此代码可以回答问题,但提供有关如何和/或为何解决问题的附加上下文将提高​​答案的长期价值。您可以在帮助中心找到有关如何编写良好答案的更多信息:https://stackoverflow.com/help/how-to-answer。祝你好运 (2认同)

Gal*_*aim 9

你可以跳过做bcrypt.genSalt和使用bcrypt.hash(password, 10, function(err, hash) {..});

你的比较功能对我来说似乎不错.

这对我来说很好:

var bcrypt = require('bcrypt');

bcrypt.hash('mypassword', 10, function(err, hash) {
    if (err) { throw (err); }

    bcrypt.compare('mypassword', hash, function(err, result) {
        if (err) { throw (err); }
        console.log(result);
    });
});
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的重构.我意识到我的哈希被我的数据库中的列大小切断了.它现在正常工作 (8认同)

Ern*_*sto 8

我不知道你是否和我一样,我遇到了同样的问题,因为我的表有 45 个字符的长度,我 bcrypt 比较哈希长度是否与 60 不同,它返回 false。只需增加表格中字符的长度


小智 7

我的问题是由于我的数据库列没有足够大的 varchar 长度。一个检查的好地方。


gha*_*ano 6

对我来说这只是一种争论障碍

正确的顺序

bcrypt.compare(plainPasswordToCheck, hashedPasswordOnStorage)
Run Code Online (Sandbox Code Playgroud)