【问题标题】:Why hashing the reset password token?为什么要散列重置密码令牌?
【发布时间】:2022-03-23 05:47:51
【问题描述】:

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

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多