目前,我正在使用双因素身份验证,随机 6 位代码作为第二个因素,通过短信或电子邮件发送。我现在想通过使用 HOTP 标准来加强这一点。并找到了一个看起来很整洁的好课。
但我正在考虑将第二个因素存储在哪里以及检查它的方法的实现和最佳实践。这是我建议的流程:
- 用户输入第一次认证:用户名+密码
- 成功时将会话行添加到
session
-table;以及使用上述类生成的 OTP。并通过电子邮件/短信发送给用户。 - 页面重新加载
- 会话可用,但行中仍有 OTP,因此会显示一个表单以输入第二个因素。
- 正在验证第二个因素(三次尝试,之后整个会话被撤销)
- 成功后,OTP 会从会话行中删除,并且
otp_done
-field 会更新为 true。 - 页面重新加载
- 会话处于活动状态,
otp_done
=true 所以显示应用程序。
注意事项:
如果会话被劫持(尽管是随机且唯一的),它们将获得完全访问权限。将 otp 存储在会话中并在每次页面加载时对其进行验证是否更好。但不知何故,这听起来是双重的。而且它只为方程增加了 6 位数的随机性。
是否有标准化的方式来实施这些 OTP?
我的实现是好的还是其中存在安全漏洞?
key
应该使用什么来生成 OTP?HOTP 标准是否为同一密钥返回不同的 otp?
sessions-table
id (int) | sessionid (str) | user (int) | otp (int|null) | otp_done (bool) | otp_tries (int)
Session_id 是使用生成的 32 位字符串bin2hex(openssl_random_pseudo_bytes(32))