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

Security 处理2FA代码的过期和验证,security,jwt,brute-force,two-factor-authentication,Security,Jwt,Brute Force,Two Factor Authentication,我目前正在计划一个2FA实现,要求用户通过SMS为某些操作(如登录)提供代码。我也会使用谷歌验证器之类的工具,但我不希望用户强制下载应用程序,这就是为什么我需要通过短信或电子邮件发送代码的原因 到目前为止,我的计划是: 用户想要登录并请求一个代码 后端生成一个数字代码,将其散列存储在DB中,并将数据库项的ID或选择器返回给前端 前端在用户电子邮件和密码旁边显示一个代码输入字段 代码通过SMS/电子邮件发送给用户 用户现在有5分钟的时间将选择器+代码+电子邮件+密码发送到后端,所有这些都将在后端得

我目前正在计划一个2FA实现,要求用户通过SMS为某些操作(如登录)提供代码。我也会使用谷歌验证器之类的工具,但我不希望用户强制下载应用程序,这就是为什么我需要通过短信或电子邮件发送代码的原因

到目前为止,我的计划是:

用户想要登录并请求一个代码 后端生成一个数字代码,将其散列存储在DB中,并将数据库项的ID或选择器返回给前端 前端在用户电子邮件和密码旁边显示一个代码输入字段 代码通过SMS/电子邮件发送给用户 用户现在有5分钟的时间将选择器+代码+电子邮件+密码发送到后端,所有这些都将在后端得到验证 关于这一点的两个问题:

1处理代码过期

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

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

这是一个好方法吗?或者你们有没有发现任何问题,或者有没有更好的方法来处理?或者是否也有一个库,用于对密码进行哈希运算,并注明有效期

2验证和处理暴力攻击

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

我想做的是:

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

我认为您使用JWTs对六位数验证代码的安全性做得太过分了

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

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


顺便说一句,这个方案对于生成各种nonce非常有用。使用过一次的数字。nonce在很多方面都很方便,比如通过电子邮件重置密码。

我想知道您是否考虑过采用“身份验证即服务”系统之一?Onelogin、Okta、Ping、Auth0等。您将能够直接处理FIDO密钥、SMS 2f、各种联合系统等。而且,别忘了您必须提前验证SMS号码,并防止恶意者欺骗验证。嘿,琼斯,当然,用户必须在注册时验证设备。是的,我考虑过其中一些服务,但大多数都有缺点。有些人需要应用程序,有些人不能通过电子邮件发送代币,有些人很贵,而且大多数人都在美国存储数据,在那里会遇到一些GDPR问题。此外,我还想了解自己构建it的问题所在,看看我的方法是否正确: