提问者:小点点

如何从Node.js中的DB中获取散列密码,以便bcrypt可以对其进行比较


我有一个注册页面,用户可以在上面向数据库发送请求。 在发送请求之前,我使用salt+hash算法修改密码。

来自数据库的示例:

用户名:AUSER1234

密码:密码12345

哈希:$2B$13$DTBZ4IEMDEXKQHWCL7LZQE8NKNYKBVA2MQWK8GNPDLWC4O6HYVEW2

我试图从数据库中获取散列密码,但我的代码有三个问题。

  1. 验证用户名存在后,如何从数据库访问哈希密码?
  2. 然后如何在GetConnection().Query()...
  3. 中使用Await BCrypt.Compare(password,hashedPassowrd);
  4. router.post回调函数是否也需要async
router.post('/user_login', async (req, res) => { //Does this needs to be an async callback function?

    const username = req.body.thisUsername; //aUser1234
    const password = req.body.thisPassword; //password12345

    const sqlString = "SELECT username FROM student_demographics WHERE username = ?";

    getConnection().query(sqlString, [username], async (err, results, fields) => {

        if(err){
            res.sendStatus(500);      
        }

        if(results.length){ 

            console.log("NO ERRORS HERE");   //WORKS OKAY UNTIL HERE

            //HOW TO GET HASHED PASSWORD AND STORE IT ON VARIABLE
            const isValid = await bcrypt.compare(password, hashedPassowrd); //ERROR

            if(isValid){
                //PASSWORD MATCHED
                res.redirect('/homePage.html');
                res.end();
            }else{
                //PASSWORD DIDN'T MATCH
                res.redirect('/login.html');
            }
        }else{ //THE USERNAME DOES NOT exists
            console.log("    > The username or password are invalid :(")
            res.redirect('/login.html');
            res.end();
        }
    });
});

共1个答案

匿名用户

您需要从数据库中选择哈希密码进行比较。

也许是这样的:

router.post("/user_login", (req, res) => {
  const username = req.body.thisUsername; //aUser1234
  const password = req.body.thisPassword; //password12345
  const sqlString = "SELECT hashed_password FROM student_demographics WHERE username = ? LIMIT 1";

  getConnection().query(sqlString, [username], async (err, results, fields) => {
    if (err) {
      console.log(err);
      res.sendStatus(500);
      return;
    }
    if (!results.length) {
      console.log("    > The username is invalid :(");
      res.redirect("/login.html");
      res.end();
      return;
    }
    const [hashedPassword] = results[0];
    const isValid = await bcrypt.compare(password, hashedPassword);
    if (isValid) {
      //PASSWORD MATCHED
      res.redirect("/homePage.html");
      res.end();
    } else {
      console.log("    > The password is invalid :(");
      res.redirect("/login.html");
      res.end();
      return;
    }
  });
});

注意,您没有对登录信息进行任何操作(您可能希望将其保存在会话或cookie中)。