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

Javascript 如何使用bcrypt从数据库中检索加密密码?,javascript,node.js,express,bcrypt,Javascript,Node.js,Express,Bcrypt,我有一份带注册和登录表的申请表。我已经成功地将加密密码输入到数据库中,但是当我登录时想要比较密码时,我似乎无法让它工作。我将如何在我的login post方法中实现bcrypt 这是我成功存储密码的注册帖子: router.post('/register', (req, res) => { bcrypt.hash(req.body.password, 10).then((hash) => { let userData = req.body; let user = ne

我有一份带注册和登录表的申请表。我已经成功地将加密密码输入到数据库中,但是当我登录时想要比较密码时,我似乎无法让它工作。我将如何在我的login post方法中实现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});
        }
    }
  });
});
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});
            }
        });
    }}
  });
});

这里没有什么需要注意的

  • 密码通常使用单向散列函数进行加密,这意味着您不应该期望将保存的密码解密回原始文本

  • 在单向散列函数中,每次为相同的输入创建相同的散列(加密输出)。例如:如果您可以加密单词“mysimplepassword”,每次的输出都将是相同的“xjjklqjlj34309dskjle4”(只是一个示例)

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


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

    这里需要注意的几点

  • 密码通常使用单向散列函数进行加密,这意味着您不应该期望将保存的密码解密回原始文本

  • 在单向散列函数中,每次为相同的输入创建相同的散列(加密输出)。例如:如果您可以加密单词“mysimplepassword”,每次的输出都将是相同的“xjjklqjlj34309dskjle4”(只是一个示例)

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


  • 如果您使用的是
    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
            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});
            }
        }
      });
    });
    
    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});
                }
            });
        }}
      });
    });
    

    我找到了答案,现在正在成功地比较散列密码。以下是新的登录帖子:

    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});
            }
        }
      });
    });
    
    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});
                }
            });
        }}
      });
    });
    

    我认为你做不到
    ==哈希密码的比较。您是否尝试过使用
    bcrypt.compare(…)
    ?我认为你做不到
    ==哈希密码的比较。您是否尝试过使用
    bcrypt.compare(…)
    ?是的,我可能把问题的措辞弄错了。我不是想解密密码,我只是想比较一下。我已经设法弄明白了如何在我的post方法中实现bcrypt.compare(),现在它工作正常了。谢谢你的建议和信息。很高兴听到@NiceuYea,我可能把我的问题措辞错了。我不是想解密密码,我只是想比较一下。我已经设法弄明白了如何在我的post方法中实现bcrypt.compare(),现在它工作正常了。谢谢你的建议和信息。很高兴听到@Niceu