bcrypt密码比较函数总是返回false

时间:2017-10-30 01:58:13

标签: mysql node.js bcrypt password-encryption password-hash

我使用node,mysql作为服务器,DB和离子在前端。我已经设法使用bcrypt注册一个使用哈希的用户,并尝试对用户进行身份验证以将其登录。

当比较用户输入的密码时,在bcryptJS中,我们似乎无法解密他们的密码。当我在我的数据库中使用console.log密码和用户查找结果时,我将用户输入的密码与存储的哈希进行比较,因此我总是将400状态重新调整到前端。

验证码:

app.post('/login', function(req, res) {
  connection.connect(function(err) {
    let email = req.body.email;
    let password = req.body.password;

    connection.query("SELECT * FROM sometable WHERE username = ? ", [email], function(error, results, fields) {


       bcrypt.compare(req.body.password, results[0].password, function(err, result) {
         console.log('>>>>>> ', password)
         console.log('>>>>>> ', results[0].password)
         if(result) {
           return res.send();
         }
         else {
           return res.status(400).send();
         }
       })
    });

  });
});

将用户输入的密码与存储在我的数据库中的哈希进行比较的正确方法是什么?

感谢您的帮助。

编辑:

我已经尝试了下面的代码(添加密码字符串),我仍然得到错误的结果......我在这里缺少什么?

 bcrypt.compare('somePassword', 'somePassword', function(err, res) {
          if(res) {
            console.log('true')
          } else {
           console.log('false')
          }
        });

4 个答案:

答案 0 :(得分:1)

在进行比较之前检查以确保您拥有密码,以了解密码是否匹配。

请参阅下面的修改



app.post('/login', function(req, res) {
  connection.connect(function(err) {
    let email = req.body.email;
    let password = req.body.password;

    connection.query("SELECT * FROM sometable WHERE username = ? ", [email], function(error, results, fields) {
      if (results[0].password) {
        bcrypt.compare(req.body.password, results[0].password, function(err, result) {
         console.log('>>>>>> ', password)
         console.log('>>>>>> ', results[0].password)
         if(result) {
           return res.send();
         }
         else {
           return res.status(400).send();
         }
       })
      }
    });
  });
});




答案 1 :(得分:1)

因此,正如问题评论中所讨论的那样,问题结果是用于存储散列密码的列​​的格式。

例如,如果您将列设置为char(50),则某些数据库将默默地删除50个字符以外的任何内容,或者如果您的字符数较少,则添加空格以获得50个字符。

然后打破与散列版本的比较。

答案 2 :(得分:0)

对不起!我有一些问题的坚果,它是从mysql来的,这是因为我在CHAR(50)中有一个列称为密码的密码,所以如果哈希值比50字符长,它将被截断,所以哈希密码很长,所以我已将字段从CHAR(50)更改为VARCHAR(255); 然后一切开始正常

答案 3 :(得分:0)

app.post('/login', function(req, res) {
  connection.connect(function(err) {
    let email = req.body.email;
    let password = req.body.password;

    connection.query("SELECT * FROM sometable WHERE username = ? ", [email], function(error, results, fields) {
    if(error) throw error;
    else { 
        if(results.length > 0) { 
        bcrypt.compare(req.body.password, results[0].password, function(err, result) {
         if(result) {
           return res.send({ message: "Login Successful" });
         }
         else {
           return res.status(400).send({ message: "Invalid Password" });
         }
        });
    } else {
        return res.status(400).send({ message: "Invalid Email" });
    } 
    }
});
});
});