BCRYPTJS:为不同的密码返回相同的散列

BCRYPTJS: returning same hash for different passwords

我在 google 上没有发现任何有类似问题的人,无论用户输入什么密码都会发生什么 returns hash 就好像那是正确的密码一样,但你可以输入任何东西当它在数据库中找到时,它仍然 return 与该邮件相同的散列密码。

例如:

密码输入:asd

bcrypt: a$EkucFAxlupmAzec1CDnBmuYugwAO4cXj.5bt/thg8l/dG0JDhMScm

密码输入:astastas

bcrypt: a$EkucFAxlupmAzec1CDnBmuYugwAO4cXj.5bt/thg8l/dG0JDhMScm

代码:

    exports.login = (req, res, next) => {
        const email = req.body.email;
        const password = req.body.password;

        Users.findOne({ email: email }).then(result => {
            if (!result) {
                throw new Error('No user with that email');
            }
            else if (crypt.compare(password, result.password)) {
                const token = jwebtoken.sign({ email: result.email },
                    'thisisatokenyoucantfake', { expiresIn: '1h' });

                res.status(200).json({ token: token });
                console.log(password);
                console.log(result.password);
            } else {
                throw new Error('No user');
            }
        }).catch(err => console.log(err));
    };

mongodb图集用于存储散列密码,加密长度为12.

如果有人需要解决方案:

exports.login = (req, res, next) => {
    const email = req.body.email;
    const password = req.body.password;

    Users.findOne({ email: email }).then(result => {
        if (!result) {
            throw new Error('No user with that email');
        } else {
            return crypt.compare(password, result.password);
        }
    }).then(result => {
        if (result) {
            const token = jwebtoken.sign({ email: result.email },
                'thisisatokenyoucantfake', { expiresIn: '1h' });

            res.status(200).json({ token: token });
        } else {
            throw new Error('Wrong password');
        }
    }).catch(err => console.log(err));
};

bcrypt.compare 异步的 - 它 return 是一个承诺。您的 if 语句将始终 return 为真,因为 promise 是一个真值。您需要使用 await.then() 来解决承诺以获得结果布尔值。

您还记录了输入的纯文本密码和存储的散列 - 存储的散列应该始终与这一点相同。