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()
来解决承诺以获得结果布尔值。
您还记录了输入的纯文本密码和存储的散列 - 存储的散列应该始终与这一点相同。
我在 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()
来解决承诺以获得结果布尔值。
您还记录了输入的纯文本密码和存储的散列 - 存储的散列应该始终与这一点相同。