语音和短信 OTP 更安全的是:随机数还是生成类似于 HOTP?

信息安全 验证 密码管理 多因素 一次性密码
2021-08-20 01:02:14

许多提供商正在为他们的登录创建 OTP 身份验证。但是我注意到我遇到的所有语音和 SMS OTP 都是一系列 6 位数字......类似于 Google Authenticator 发出的 HOTP RFC 标准。

在以下情况下,我会看到这些六位数的 OTP:

  1. 使用电话进行身份验证(谷歌和一些银行......)
  2. 向我的手机发送短信(Facebook 和 Google ...)
  3. 通过已验证的电子邮件地址验证帐户
  4. 验证我的家庭住址(Google Business、IRS 强身份验证)

...即任何不使用智能 OTP 令牌或设备的 OTP(YubiKey、Google Authenticator、Gemalto 等)

问题

关于保护发布 OTP 的 IdP,使用随机数与像 HOTP 这样的种子有什么好处和缺点?

如果一次性密码存储在数据库中,以下是一些场景可能会发生的情况。一种情况是基于 HOTP 风格的种子,另一种情况是基于随机数:

  1. 如果(加盐的)密码数据库被盗/提取,则 HOTP 种子很可能存储在同一位置。在这种情况下,数据中心的安全性完全依赖于保护数据库和 HOTP 种子。

    攻击者将拥有 HOTP 种子,直到该种子被重置,这可能永远不会。

  2. 相反,如果数字是从 random() 生成并写入数据库,则没有种子可以妥协。它可以被利用的唯一方法是攻击者对数据库具有实时读取访问权限。

从该快速概述看来,种子 OTP(如 HOTP)不应在这些场景(语音和 SMS)中使用。

这是一个正确的结论吗?

1个回答

棘手的一点是使用前同步。当您想使用一次性密码时,客户端必须“以某种方式”了解要使用的一次性密码。HOTP适用于这种带外同步是通过在客户端和服务器端都维护的计数器的情况。

如果您有另一个可以基于每个连接调用的带外机制(例如 SMS),那么您不需要 HOTP 提供的计数器管理。HOTP也是一个很好的PRNG/dev/urandom ,但从操作系统工具(及其同类)生成随机一次性密码更简单。正如您所指出的,HOTP 类似于带有密钥的 PRNG,密钥盗窃意味着妥协。每个连接都有一个新的随机密码,可以窥视服务器数据库的攻击者可能会了解给定用户的当前 OTP,但对下一个 OTP 一无所知,因此可以及时控制损害。

在基于 SMS 的场景中使用 HOTP(或其基于时间的变体TOTP)并不是很弱——这是一个支持用户令牌的好模型。HOTP 是对密码学的合理使用。但是,如果您有一个可用于 OTP 的准即时传输(例如 SMS)的带外通道,那么您可以使用随机生成,这会更好。