微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

处理 2FA 代码的过期和验证

如何解决处理 2FA 代码的过期和验证

我目前正在计划实施 2FA 以要求用户通过 SMS 为某些操作(例如登录)提供代码。我也会使用 Google Authenticator 之类的工具,但我不希望用户强制下载应用程序,这就是为什么我还需要通过短信(或可能的电子邮件)发送代码

我目前的计划是:

  1. 用户想要登录并请求代码
  2. 后端生成一个数字代码,将其散列存储在数据库中,并将数据库条目的 ID(或选择器)返回给前端
  3. Frontend 在用户电子邮件和密码旁边显示一个代码输入字段
  4. 代码通过短信/电子邮件发送给用户
  5. 用户现在有 5 分钟的时间将选择器 + 代码 + 电子邮件 + 密码发送到后端,所有这些都得到验证

关于此的 2 个问题:

1) 处理代码过期

我的第一个想法是将仅像密码一样散列的代码存储在数据库中,但我必须自己实现 5 分钟的过期时间。当然,我可以添加一个带有时间戳的列来检查过期时间,但我宁愿使用更安全的方法

现在我正在考虑将代码存储在数据库中 json Web 令牌的 claim 对象中,并将此令牌的到期时间设置为 5 分钟。因此,在 5 分钟结束后,解析 Web 令牌以将其与用户发送的代码进行比较失败。这将允许我在发生攻击情况时只需更改网络令牌的秘密,所有现有代码将立即无效。

这是一个方法吗?或者你们有没有看到这方面的任何问题,或者有更好的处理方法?或者是否有一个用于对密码进行哈希处理的库以及过期日期?

2) 验证和处理暴力攻击

由于我只想向用户发送 6 位或最多 8 位数字代码,因此我必须实施某种防止暴力攻击的保护措施(假设攻击者知道用户的电子邮件和密码)。

我想做什么:

  1. 如果发送一次无效代码,则增加该特定代码数据库条目的失败尝试次数 += 1
  2. 如果代码超过 3 次失败尝试,则使数据库中的代码无效并要求用户请求新代码
  3. 用户请求新代码时,让他等待 1 分钟才能请求新代码,将上次失败尝试的日期作为时间戳存储在用户数据库条目中以及 1 分钟延迟
  4. 如果第三个代码失败,存储新的时间戳并将延迟加倍到 2 分钟 ... 等等。在 3 个失败的代码之后,还需要一个 JS 挑战 (Google Recaptcha)。
  5. 重试 5 次后,我会锁定帐户并等待用户与我们联系。

这是一种处理代码验证的安全方法吗?

解决方法

我认为您使用 JWT 过度保护了您的六位数验证码。

无论您如何管理它们,您都必须在它们到期或使用时使它们失效。这样做的一个好方法是在表中为每个代码指定一行,包括过期时间戳。然后在用户呈现代码时删除代码行。每当您查找这些代码时,将 WHERE expires > NOW() 添加到查询中。并定期删除过期的行。

抵抗蛮力攻击很简单。当您准备好向用户发送代码时,您已经验证了他们的密码,因此您知道他们假装的是谁。因此,只需跟踪该用户猜测代码的尝试即可。按照你的建议,给他们三个尝试。然后让他们请求另一个代码。如果他们在一个日历日内重新请求超过 5 个代码,请将其锁定到下一个日历日。

顺便说一下,这个方案对于生成各种随机数很有用。 (数字使用一次。)Nonce 可用于多种用途,例如通过电子邮件重置密码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。