繁体   English   中英

如何使用 bcrypt 从我的数据库中检索加密密码?

[英]How do I retrieve an encrypted password from my database with bcrypt?

我有一个带有注册和登录表单的应用程序。 我已经设法将加密的密码输入数据库,但是当我想在登录时比较它时,我似乎无法让它工作。我将如何在我的登录发布方法中实现 bcrypt?

这是我成功存储密码的注册帖子:

router.post('/register', (req, res) => {
bcrypt.hash(req.body.password, 10).then((hash) => {
    let userData = req.body;
    let user = new User(userData);
    user.password = hash;
    user.save((error, registeredUser) => {
        if (error) {
            console.log(error);
        } else {
            let payload = {subject: registeredUser._id};
            let token = jwt.sign(payload, 'secretKey');
            res.status(200).send({token});
        }
    });
  });
});

这是我的登录帖子:

router.post('/login', (req, res) => {
let userData = req.body;

User.findOne({email: userData.email}, (error, user) => {
    if (error) {
        console.log(error);
    } else {
        if(!user) {
            res.status(401).send('Invalid Email');
        } else
        if (user.password !== userData.password) {
            res.status(401).send('Invalid Password');
        } else {
            let payload = {subject: user._id};
            let token = jwt.sign(payload, 'secretKey');
            res.status(200).send({token});
        }
    }
  });
});

这里有几点需要注意。

  1. 密码通常使用单向散列function 加密,这意味着您不应该期望将保存的密码解密回原始文本。

  2. 以一种方式 hash function,每次都会为相同的输入创建相同的 hash(加密输出)。 例如:如果您可以加密单词“mysimplepassword”,则 output 每次都将是相同的“xjjklqjlj34309dskjle4”(只是一个示例)。

  3. 在这种情况下检查密码的方法是: (a) 在首次提供时(通常在注册期间)存储加密的密码(哈希) (b) 在登录期间,接收密码作为输入并使用相同的加密方法对其进行加密,以获取 hash (c) 比较 hash

如果您使用的是bcrypt ,您可以使用bcrypt.compare()来执行这些操作

我想通了,现在成功地比较了散列密码。 这是新的登录帖子:

router.post('/login', (req, res) => {
let userData = req.body;

User.findOne({email: userData.email}, (error, user) => {
    if (error) {
        console.log(error);
    } else {
        if(!user) {
            res.status(401).send('Invalid Email');
        } else {
        bcrypt.compare(req.body.password, user.password, function (err, result) {
            if (result == false) {
                res.status(401).send('Invalid Password');
            } else {
                let payload = {subject: user._id};
                let token = jwt.sign(payload, 'secretKey');
                res.status(200).send({token});
            }
        });
    }}
  });
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM