如果攻击者拥有 (N) 个先前的代码,OATH TOTP 和/或 Google Authenticator 是否容易受到攻击?

信息安全 验证 多因素 一次性密码
2021-08-14 18:10:09

我不是一个 ipsec 入门者,所以这有点过头了……但我总是愿意了解更多。

如果攻击者拥有(未指定)数量的先前一次性密码(由应用程序生成),是否存在针对 OATH TOTP(Google Authenticator's / Authy's algorithm)的已知攻击?

或者,换一种说法:有没有理由担心我过去使用过的个人 OTP 的记录?(例如,我可以在调用工具时在命令行中输入它们……还是应该像密码一样以静默方式和交互方式输入它们,以避免被记录?)

2个回答

TOTP 规范安全分析指向HOTPHOTP 使用一个计数器,由双方共享,并在每次认证成功时“重新同步”;TOTP 用当前时间的知识替换该计数器,这也是一个共享值。因此,几乎所有关于 HOTP 的安全分析都适用于 TOTP。


HOTP的安全分析使用密码学的正式工具和符号,但归结为以下假设:

Let T denotes the time to perform one computation of H.  Then if A is
any adversary with running time at most t and making at most p oracle
queries,
                   Adv(A) <= (t/T)/2^k + p^2/2^n
In practice, this assumption means that H is very secure as PRF.

这里的重要词是PRF:这意味着在攻击者(不知道密钥)看来, “H”函数( HMAC/SHA-1 )的行为类似于在所有可能函数中“随机”选择的函数. 我们让攻击者访问“oracle”,这是一台知道密钥的机器,并根据攻击者选择的输入计算 HMAC/SHA-1;攻击者可以发送p 个这样的查询。上面的表达式意味着即使在这些条件下,攻击者在他的所有查询之后成功预测一个额外输入(他没有发送到预言机)的输出的概率仍然很低(“优势”是攻击者比纯粹的运气有多少额外的成功概率)。

现在,HMAC/SHA-1 似乎表现为 PRF。没有人发现任何相反的迹象。即使面对已知的结构弱点(理论上)似乎允许某些计算 SHA-1 冲突,这仍然成立。

从这个假设出发,HOTP 的安全证明(如 RFC 4226 中所公开)建立了以下结果:

Suppose m = 10^Digit < 2^31, and let (q,r) = IntDiv(2^31,m).  Let B
be any adversary attacking HOTP using v verification oracle queries,
a <= 2^c - s authenticator oracle queries, and running time t.  Let T
denote the time to perform one computation of H.  If Assumption 1 is
true, then
     Adv(B) <= sv * (q + 1)/2^31 + (t/T)/2^k + ((sv + a)^2)/2^n
In practice, the (t/T)2^-k + ((sv + a)^2)2^-n term is much smaller
than the sv(q + 1)/2^n term, so that the above says that for all
practical purposes the success rate of an adversary attacking HOTP is
sv(q + 1)/2^n, just as for HOTP-IDEAL, meaning the HOTP algorithm is
in practice essentially as good as its idealized counterpart.

最后一段就是你所追求的:假设 HMAC/SHA-1 是一个 PRF,事实证明,提供对许多以前的一次性密码的访问权限并没有给攻击者猜测下一个密码的任何优势,至少不会比他从“理想”版本的 HOTP 中得到的更多,其中一次性密码是通过纯粹的不可预测的魔法获得的。


总结:不用担心。HOTP(和 TOTP)对以前记录了许多一次性密码的情况的抵抗是 HOTP安全模型的一部分,并且已专门针对此类情况进行了屏蔽。这里的屏蔽依赖于 HMAC/SHA-1 上的安全假设,虽然没有得到证明,但与这些东西所能达到的一样好(特别是因为很有可能函数族是 PRF 的事实可能是数学上不可能证明;有关该主题的更多信息,请参见this)。

令牌是使用 HMAC 库计算的,基本上:

HOTP(K,C) = Truncate(HMAC-SHA-1(K,C))

K存储在您的手机和验证服务器上的秘密在哪里,并且C是计数器(时间戳,如果是 TOTP)。

HMAC-SHA-1是一个单向函数,这意味着无论之前观察到的任何值如何,都应该不可能获得 K,C。众所周知,SHA-1 有一些弱点,但它仍然相当可信,可以使此类攻击不切实际。