如何使用 bcrypt 从我的数据库中检索加密的密码?
How do I retrieve an encrypted password from my database with bcrypt?
我有一个带有注册和登录表单的应用程序。我已经设法将加密的密码输入到数据库中,但是当我想在登录时比较它时,我似乎无法让它工作。我将如何在我的登录 post 方法中实现 bcrypt?
这里是我的注册机post,密码保存成功:
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});
}
});
});
});
这是我的登录信息 post:
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});
}
}
});
});
这里有几点需要注意。
密码通常使用单向散列函数加密,这意味着您不应该期望将保存的密码解密回原始文本。
在单向散列函数中,每次都会为相同的输入创建相同的散列(加密输出)。例如:如果您可以加密单词 "mysimplepassword",那么每次输出都将是相同的 "xjjklqjlj34309dskjle4"(只是一个样本)。
此类场景的密码校验方法为:
(a) 在首次提供时(通常在注册期间)存储加密密码(哈希)
(b) 登录时,接收输入的密码,用同样的加密方式加密,得到hash
(c) 比较hash
如果您正在使用bcrypt
,您可以使用bcrypt.compare()
来执行这些操作
我想通了,现在正在成功比较散列密码。这是新登录 post:
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});
}
});
}}
});
});
我有一个带有注册和登录表单的应用程序。我已经设法将加密的密码输入到数据库中,但是当我想在登录时比较它时,我似乎无法让它工作。我将如何在我的登录 post 方法中实现 bcrypt?
这里是我的注册机post,密码保存成功:
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});
}
});
});
});
这是我的登录信息 post:
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});
}
}
});
});
这里有几点需要注意。
密码通常使用单向散列函数加密,这意味着您不应该期望将保存的密码解密回原始文本。
在单向散列函数中,每次都会为相同的输入创建相同的散列(加密输出)。例如:如果您可以加密单词 "mysimplepassword",那么每次输出都将是相同的 "xjjklqjlj34309dskjle4"(只是一个样本)。
此类场景的密码校验方法为: (a) 在首次提供时(通常在注册期间)存储加密密码(哈希) (b) 登录时,接收输入的密码,用同样的加密方式加密,得到hash (c) 比较hash
如果您正在使用bcrypt
,您可以使用bcrypt.compare()
来执行这些操作
我想通了,现在正在成功比较散列密码。这是新登录 post:
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});
}
});
}}
});
});