当注册(通过哈希)和登录使用2种不同的javascript函数时,如何将密码与数据库中的哈希密码进行比较?

时间:2019-03-30 20:07:02

标签: javascript authentication hash bcrypt

我正在使用javascript进行身份验证程序。我没有散列工作。为此,我使用一个存储用户ID,用户名和密码的数据库。使用注册功能将用户信息添加到数据库中。然后,我们有一个登录页面,该页面发送sql查询以使用用户名和密码来获取用户。如果存在匹配项,则将会话设置为找到的用户,然后转到仪表板。

使用散列时,我使用 bcrypt 成功地对密码进行了散列,并将其存储在数据库中。但是,当尝试使用bcrypt的比较功能比较用户提供的密码时,未定义哈希。我该如何运作?

我尝试使用以下内容:

  

let hash = bcrypt.hashSync(password,10);

这会散列用户提供的密码,但这会给我一个新的不同密码,因为这是散列的工作方式。不包括哈希变量时,总是会得到未定义的错误。

exports.login = function(req, res){
  let sess = req.session;
  if(req.method === "POST"){        
    let bcrypt = require('bcrypt');
    let saltRounds = 10;
    let post = req.body;
    let name = post.user_name;
    let password = post.password;
    let sql = "SELECT id, first_name, last_name, user_name FROM `users` WHERE `user_name`='" + name + "'";

    bcrypt.compare(password, hash, function(err, res) {
        db.query(sql, function(err, results){
         if(results.length && res){
            req.session.userId = results[0].id;
            req.session.user = results[0];
            console.log(results[0].id);
            res.redirect('/home/dashboard');
         }
         else{
            message = 'Username or password incorrect';
            res.render('index.ejs',{message: message});
         }

      });
    });
  } else {stuff}
}

密码哈希处理在另一个函数中也是如此:

exports.signup = function(req, res){
message = '';
if(req.method === "POST"){
   // bcrypt hashing: Maybe planning on doing passport if usefull
   let bcrypt = require('bcrypt');
   let saltRounds = 10;
   let post = req.body;
   let name = post.user_name;
   let password = post.password;
    bcrypt.hash(password, saltRounds, function(err, hash) {
             let sql = "INSERT INTO `users`(`user_name`,`password`) VALUES ('" + name + "','" + hash + "')";
             let query = db.query(sql, function (err, result) {
                 message = "Account has been created.";
                 res.render('signup.ejs', {message: message});
             });
    });


} else {
  res.render('signup');
}
};

目标是拥有哈希密码并进行有效的比较。现在,我只能进行散列操作,而且不知道如何执行第二部分。

  

我想将两个功能分开

代码在没有哈希的情况下正常工作。但是升级是目标。

1 个答案:

答案 0 :(得分:0)

  

然后,我们有一个登录页面,该页面发送sql查询以使用用户名和密码来获取用户。如果存在匹配项,则将会话设置为找到的用户,然后转到仪表板。

现在应该使用相同的方法。而不是检索密码,而是检索哈希,而不是使用bcrypt.compare来检查其是否相等。

  

但是,当尝试使用bcrypt的比较功能比较用户提供的密码时,未定义哈希。我该如何运作?

您的hash变量未定义,因为您需要先执行SQL查询:

let name = post.user_name;
let password = post.password;
// TODO: rename "password" column to "password_hash"
let sql = "SELECT id, password, first_name, last_name, user_name FROM `users` WHERE `user_name`=?";
//                    ^^^^^^^^               prevent SQL injection by using parameterised query ^

db.query(sql, name, function(err, results) {
  if(!err && results.length) {
    var hash = results[0].password;
//  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    bcrypt.compare(password, hash, function(err, ok) {
      if (!err && ok) {
        req.session.userId = results[0].id;
        req.session.user = results[0];
        …
      } else{
        …
      }
    });
  } else {
    …
  }
});