在Node.js中使用bcrypt进行密码哈希

时间:2019-02-08 13:44:05

标签: node.js bcrypt

我正在使用"bcrypt": "^3.0.4",并且拥有最新的稳定版本的node。我面临的问题是用户尝试登录时。使用正确的密码,首次登录尝试始终不会成功,而第二次尝试则成功。我想知道我在哪里弄错了。这里的假设是用户输入了数据库中可用的电子邮件/用户名,在这种情况下为mongodb。

User.findOne({ "email": user.email }, (err, ruser) => {
    if (err) {
        res.send(err);
    }
    else {
        bcrypt.hash(user.password, 10, function (err, hash) {
            if (err) {
                console.log(err);
            }
            else {
                bcrypt.compare(user.password, hash).then(function (res) {
                    if (res) {
                        pass = true;
                    }
                    else {
                        pass = false;
                    }
                });
                res.json(pass);
            }
        });
    }
});

谢谢。

1 个答案:

答案 0 :(得分:1)

您的代码有两个问题。

  1. bcrypt.compare是异步的,并且res.json在.then之外,因此res.json实际上是在比较之前或在pass设置之前运行的。

  2. pass没有用var / let定义,因此pass成为全局变量,这对安全性具有很强的影响。 ,因为两个用户同时登录会导致竞争(例如,会话A中的pass可能会在会话B中重新解析)

由于上述两个错误,它的工作原理是:在第一个请求中,在比较之前执行res.json,并且尚未设置pass,因此它返回null。在第二个请求上,在比较之前再次执行res.json,但是这次pass包含最后一次比较的值,因此您得到的实际上是最后一次比较的结果。

此外,如果您只是在测试,也可以,否则此代码不执行任何操作,因为此代码将生成给定密码的哈希,并将给定密码与生成的哈希进行比较,这肯定永远是正确的。 / p>