微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

来自 bcryptjs 的 bcrypt.compare 总是返回 false

如何解决来自 bcryptjs 的 bcrypt.compare 总是返回 false

我在 React 和 Node js 项目上使用 bcryptjs,但似乎无法让它返回 true。在所有在线验证器上,它使用密码和哈希返回为有效。我已经验证了长度是正确的,但无法让它工作。

我的 HandleSubmit 函数

        event.preventDefault();
        const self = this;
        const data = `username=${encodeURIComponent(this.state['username'])}&`;
        axios.post(`/test/do_login/${data}`)
            .then(function (response) {
                console.log("RESPONSE");
                console.log(response);
                bcrypt.compare(self.state.password,response.data).then(function (result) {
                    console.log(`PW: ${self.state.password}\nDATA:${response.data}\nRES:${result}`);
                    if (result) self.setState({ loginSuccess: true });
                });
            });
    }

在服务器上:

const express = require('express');
const bcrypt = require('bcryptjs');
const router = express.Router();

const regexp = /=(.+?)&/g



router.post('/do_login/:data',(req,res) => {
    var con = req.app.get('con');
    var args = [...(req.params.data).matchAll(regexp)];

    console.log(args);

    var username = args[0][1];

    query = `SELECT * FROM users WHERE username="${username}";`

    con.query(query,(err,result) => {
        if (err) throw err;
        console.log(result);
        if (result.length < 1) res.send("USERNAME_INV")
        else {
            res.send(String(result[0].pw).slice(0,59)); 

        };

    });
});

module.exports = router;

我正在使用 slice 删除数据库条目末尾的 \u000。它存储在一个 BINARY(60)

解决方法

我认为您试图以错误的方式解决此问题。

在您的 React 应用程序中,只需将带有正文负载(用户名和密码)的请求发布到您的服务器。而已。不要将凭据作为查询参数发送,这是不安全的。

在您的 nodejs 应用程序中,您必须处理此调用:

  • 与将是散列的密码(来自您的身体)和存储在您的数据库中的密码(也经过散列)进行比较
  • 将 cookie 或 access_token 发送到您的 React 应用程序,每次您为下一个请求调用服务器时都会发送这些信息。您必须创建一个中间件来检查 cookie 或 access_token。

此外,请检查您的用户名字段以避免 sql 注入。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。