验证 OTP,无需将其存储在数据库和会话等任何地方

问题描述 投票:0回答:2

我生成了一个八位随机 OTP 并使用 servlet 将其发送到邮件。我想在下一页验证 OTP,而不将其存储在数据库和会话等任何地方。我该怎么做?

java servlets
2个回答
2
投票

此技术是通过以下步骤完成的:

  • 创建电话号码、生成的 OTP 和到期时间戳组合的加密哈希 (HMAC)。
  • 将哈希值附加到过期时间戳并将哈希值发送到 用户作为第一个请求的响应。
  • 用户收到短信后,会在第二个请求中发回哈希值、电话号码和 OTP。
  • 服务器通过散列电话号码、发送的 OTP 来验证 OTP 用户,以及用户发回的附加哈希值的到期时间戳。使用相同的密钥和相同的算法。
  • 到期时间戳是否有效且仍在未来。还有 新生成的哈希值与用户发送的哈希值相匹配。然后是一次性密码 是正品。

0
投票

由于前面的答案意味着将数据存储在本地存储中,我想公开我在项目中使用的另一个解决方案。

TLDR:使用 JWT。没有存储空间但无法手动复制。

条件

仅在不要求用户手动输入代码的情况下才有效。请改用电子邮件中的 Html 按钮或 QRCode。
根据具体情况,可能比手动复制代码有更好的用户体验。

设置

  • 生成包含用户 ID的 JWT 用于识别,并在 JWT 上签名到期日期
  • 构建一个 URL 针对您的服务器或密码重置页面 在参数中使用 JWT
  • 通过电子邮件将链接发送给用户。
  • 打开链接时,用户将使用 JWT 发出请求,然后您可以验证它并检索关联的用户 ID。

生成的 URL 示例:https://your.app/password-reset?token={JWT}

© www.soinside.com 2019 - 2024. All rights reserved.