为什么要散列重置密码令牌



我的Express应用程序中有一个忘记密码的处理程序。我发送了一封带有crypto.randomBytes(20).toString("hex")令牌的电子邮件,稍后我将使用该令牌来验证请求。它运行得很好。

然而,我看到人们在发送令牌并将其存储在数据库中之前对其进行哈希处理,我不明白为什么,因为它已经是一个随机字符串了。

const forgotPassword = async (req, res) => {
try {
const user = await User.findOne({ email: req.body.email });
if (!user) {
throw Error("incorrect email");
}
const resetPasswordToken = crypto.randomBytes(20).toString("hex");
user.resetPasswordToken = resetPasswordToken;
user.resetPasswordTokenExpire = Date.now() + 10 * (60 * 1000);
await user.save();
const message = `
<h1>You have requested a password reset</h1>
<p>Here is your token : </p>
<p>${resetPasswordToken}</p>
`;
try {
await sendEmail({
to: user.email,
subject: "Password reset request",
text: message,
});
res.status(200).json({ message: "Email sent" });
} catch (err) {
user.resetPasswordToken = undefined;
user.resetPasswordTokenExpire = undefined;
res.status(500).json({ message: "Email could not be sent" });
}
} catch (error) {
console.log(error);
const errorDetails = handleErrors(error);
res.status(400).json(errorDetails);
}
};

如果您对令牌进行散列,并且只将散列保存到数据库中,则可以确保管理员和其他能够访问数据库的人不能使用该令牌为其他用户重置密码。

这基本上与您散列(以及椒盐(密码的原因相同,因为您不希望在有人访问该表时可以重新创建原始字符串。

最新更新