许多提供商正在为他们的登录创建 OTP 身份验证。但是我注意到我遇到的所有语音和 SMS OTP 都是一系列 6 位数字......类似于 Google Authenticator 发出的 HOTP RFC 标准。
在以下情况下,我会看到这些六位数的 OTP:
- 使用电话进行身份验证(谷歌和一些银行......)
- 向我的手机发送短信(Facebook 和 Google ...)
- 通过已验证的电子邮件地址验证帐户
- 验证我的家庭住址(Google Business、IRS 强身份验证)
...即任何不使用智能 OTP 令牌或设备的 OTP(YubiKey、Google Authenticator、Gemalto 等)
问题
关于保护发布 OTP 的 IdP,使用随机数与像 HOTP 这样的种子有什么好处和缺点?
如果一次性密码存储在数据库中,以下是一些场景可能会发生的情况。一种情况是基于 HOTP 风格的种子,另一种情况是基于随机数:
如果(加盐的)密码数据库被盗/提取,则 HOTP 种子很可能存储在同一位置。在这种情况下,数据中心的安全性完全依赖于保护数据库和 HOTP 种子。
攻击者将拥有 HOTP 种子,直到该种子被重置,这可能永远不会。
相反,如果数字是从 random() 生成并写入数据库,则没有种子可以妥协。它可以被利用的唯一方法是攻击者对数据库具有实时读取访问权限。
从该快速概述看来,种子 OTP(如 HOTP)不应在这些场景(语音和 SMS)中使用。
这是一个正确的结论吗?