【问题标题】:Node bcrypt's compare always returns false节点 bcrypt 的比较总是返回 false
【发布时间】:2013-01-25 13:12:51
【问题描述】:

我很难让我的密码成功地与使用节点的 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();

我总是得到无效的密码。在与从数据库中提取的内容进行比较之前,我是否需要获取明文密码并重新加密?

【问题讨论】:

    标签: javascript node.js bcrypt


    【解决方案1】:

    这是由于密码长度为 45,增加它即可解决问题。

    【讨论】:

    【解决方案2】:

    在我的例子中,我将哈希作为命令行参数传递给节点程序 - 仅用于测试:

    node admin/bcrypt.js password $2b$10$/v9nAxpPQoDH5LMa/q.0AON/gEk.AxF57hHtIGkKR5IAWfMLyBcmm
    

    哈希以$2b$10$/开头; $2$1 被解释为位置参数并评估为空值,因此被比较的值与我传入的值不同。用 \ 转义 $ 符号解决了这个问题:

    node admin/bcrypt.js password \$2b\$10\$/v9nAxpPQoDH5LMa/q.0AON/gEk.AxF57hHtIGkKR5IAWfMLyBcmm
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        bcrypt.compare(actual_password, encrypted_password)

        而不是

        bcrypt.compare(encrypted_password, actual_password)

        => encrypted_pa​​ssword 应该是第二个参数。

        【讨论】:

        • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。您可以在帮助中心找到更多关于如何写好答案的信息:stackoverflow.com/help/how-to-answer。祝你好运?
        【解决方案5】:

        我删除了我的用户并重新创建并这样做了

        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);
        

        【讨论】:

          【解决方案6】:

          在比较函数中,不需要生成新的哈希,这样做:

          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
          };
          

          【讨论】:

            【解决方案7】:

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

            正确的顺序

            bcrypt.compare(plainPasswordToCheck, hashedPasswordOnStorage)
            

            【讨论】:

              【解决方案8】:

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

              lowercase: true,
              

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

              【讨论】:

                【解决方案9】:

                我的哈希以 $2y 开头,它必须以 $2b 开头

                这个库支持 $2a$ 和 $2b$ 前缀 bcrypt 哈希。 $2x$ 和 $2y$ 哈希是专门为 John 开发的 bcrypt 实现 松土。理论上,它们应该兼容 $2b$ 前缀。

                【讨论】:

                  【解决方案10】:

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

                  希望这对某人有所帮助!

                  【讨论】:

                    【解决方案11】:

                    我遇到了同样的问题。在将节点包从bcrypt 更改为bcryptjs 之后,比较就像一个魅力。由于包好像是fork,所以功能不需要调整。

                    【讨论】:

                      【解决方案12】:

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

                      【讨论】:

                      【解决方案13】:

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

                      【讨论】:

                      • 对我来说,问题是由于数据库中的密码换行造成的。
                      【解决方案14】:

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

                      用于存储密码的代码是:

                      //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);
                      

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

                      log4.debug('compare '+pwd+' with saved on db for user %j', userDoc.password);
                      var okPwd = bcrypt.compareSync(pwd, userDoc.password);
                      

                      所以,我看到了散列密码,它被记录为一个字符串,如 $ert3435tF.02ri 等......

                      但每次我使用注册时使用的相同密码登录时,okPwd 总是错误的。为什么?

                      即使我取消注释已注释的代码!

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

                      【讨论】:

                        【解决方案15】:

                        这对我有用。

                        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);
                            });
                        
                        });
                        

                        【讨论】:

                        • 问题是关于 bcrypt.compare。
                        【解决方案16】:

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

                        【讨论】:

                        • 感谢重构。我意识到我的哈希被我的数据库中的列大小砍掉了。它现在正常工作
                        • 嗨,我想知道,如果我们使用异步函数,它们是否必须像您的示例一样处于循环中,或者您可以将散列和比较两种方法分开。
                        • 我有同样的问题,想知道如果将hash 设置为字符串是否会导致问题?
                        • 出于某种原因,我总是从bcrypt.compare 中得到false,一个天真的== 以及库中的函数buffer-equal-constant-time 给出true(这是正确的),给出在这里bcrypt
                        • 给 10 个数字作为 .hash() 的第二个参数会在运行时出错。
                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 2021-09-04
                        • 1970-01-01
                        • 2022-10-05
                        • 1970-01-01
                        • 2020-05-24
                        • 2017-09-16
                        • 2022-11-09
                        相关资源
                        最近更新 更多