我已经按照RFC 6238实现了双因素身份验证系统的登录/验证方面。
它适用于 Google Authenticator,非常棒。
现在我将注意力转向备份代码,这些代码由实现 2FA 的服务(例如 Google 和 GitHub)提供。
我注意到它们的长度和/或格式与通常的 6 位直接验证码不同。
我也是:
- 当用户设置 2FA 时生成任意数量的代码
- 将它们与用户一起存储在数据库中
- 利用它们的长度或格式不同的事实来决定如何检查它们?
它们应该是随机的,还是根据用户的一些哈希生成的?
我已经按照RFC 6238实现了双因素身份验证系统的登录/验证方面。
它适用于 Google Authenticator,非常棒。
现在我将注意力转向备份代码,这些代码由实现 2FA 的服务(例如 Google 和 GitHub)提供。
我注意到它们的长度和/或格式与通常的 6 位直接验证码不同。
我也是:
它们应该是随机的,还是根据用户的一些哈希生成的?
通常备份代码是不透明的随机凭证,不是基于数学上的 2FA 种子或任何其他关于用户的已知信息,并且具有足够的长度和熵来生成以避免字典攻击。
把它们当作一次性密码对待——在存储之前对它们进行哈希处理,这样你就没有原件;认证使用一次后丢弃;限制身份验证尝试的次数和速率;并允许经过身份验证的用户生成一个新集合,这会使之前的集合无效。