节点bcrypt的比较总是返回false

时间:2013-02-10 05:50:59

标签: javascript node.js bcrypt

我很困难,试图让我的密码与使用节点的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();

一切正常。我的数据库有加密密码。但是当用户登录时,我无法从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();

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

13 个答案:

答案 0 :(得分:8)

您可以跳过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);
    });
});

答案 1 :(得分:3)

我不知道你是否和我一样,我遇到了同样的问题,因为我的表有45个字符的长度,而且如果散列长度与60不同,我会进行比较,返回false。只需增加表格中的字符长度

答案 2 :(得分:2)

我的数据库列没有足够大的varchar长度。一个值得检查的好地方。

答案 3 :(得分:2)

我有同样的问题。在将节点包从bcrypt更改为bcryptjs之后,这种比较就像一个魅力。由于该软件包似乎是一个分支,因此无需调整功能。

答案 4 :(得分:0)

这适合我。

var bcrypt = require('bcrypt');
var salt = bcrypt.genSaltSync();

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

    bcrypt.compare('mypassword', hash, function(err, result) {
      if (err) { throw (err); }
      console.log(result);
    });

});

答案 5 :(得分:0)

我遇到了同样的问题,但我确信我没有对密码进行两次编码。这就是事情。 bcrypt-nodejs npm包在v0.0.3上,我正在使用这个版本。我正在编写算法来在注册时存储用户密码并在登录时读取用户密码。 前端是一个简单的输入文本,用于电子邮件字段和输入密码字段的密码。当我提交请求时,我在本地节点服务器上发送了一个对https://localhost ...的呼叫。我可以记录收到的数据,我可以看到记录的密码与前端插入的密码相同。

用于存储密码的代码是:

TIMESTAMP

用于读取和比较密码的代码是:

//var user.bcrypt = bcrypt.genSaltSync(10);;
var clearPwd = user.password;
user.password = bcrypt.hashSync(clearPwd);//, user.bcrypt);
log4.debug("hashSyncked: "+ user.password);
db.userSave(user, cb);

所以,我看到哈希密码,它被记录为像$ ert3435tF.02ri等字符串......

但每次我使用我注册的相同密码登录时, okPwd 始终为false。为什么呢?

即使我取消评论评论代码!

<强>更新 我找到的解决方案是关于方法。密码不应该像那样存储和阅读,它太......粗鲁!提到了正确的方法here小心!该指南中存在错误。 bcrypt.hash(...)函数需要2个对象参数和2个回调!最后一个是在散列过程结束时调用的那个,第一个被调用来跟踪散列过程。我把它设为 null ,一切正常。 我承认我犯了另一个错误:我使用了bcrypt-nodejs包而不是brcrypt。

答案 6 :(得分:0)

我遇到了同样的问题,对我来说,解决方案是修复前端的错字。我正在从表单中发送“密码”,并期待“密码”。然后,bcyppt以某种方式对返回的未定义值进行哈希处理,这就是compare()始终返回false的原因。

希望这对某人有帮助!

答案 7 :(得分:0)

我的哈希从$ 2y开始,并且必须从$ 2b开始

此库支持$ 2a $和$ 2b $前缀bcrypt哈希。 $ 2x $和 $ 2y $散列特定于为John开发的bcrypt实现 松土。从理论上讲,它们应该与$ 2b $前缀兼容。

答案 8 :(得分:0)

对我有用的另一种可能的解决方案是,如果在您的用户模型中将您放在密码字段下。

lowercase: true,

我碰巧从另一个字段复制了这个。当我删除它时,问题消失了。

答案 9 :(得分:0)

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

正确的顺序

bcrypt.compare(plainPasswordToCheck, hashedPasswordOnStorage)

答案 10 :(得分:0)

我删除了我的用户并重新创建并执行了此操作

const isMatch = await bcrypt.compare(password, user.password);
console.log(user.password, isMatch);
if (!isMatch) {
  return res.status(400).json({
    msg:
      "Sorry, your password was incorrect. Please double-check your password.",
  });

在创建用户时,我这样做了

const salt = await bcrypt.genSalt(10);
user.password = await bcrypt.hash(password, salt);

答案 11 :(得分:0)

在compare函数中,不需要生成新的hash,这样做:

async function Login(email, password) {
  const user = await this.service.getByEmail(email);

  const passwordBd = user.user_password;

  const matching = await bcrypt.compare(password, passwordBd);

  console.log(matching); //true
};

答案 12 :(得分:-2)

只需修改数据库中分配给密码字段的字符长度,也许生成的哈希值大于字段可以支持的长度