如果之前的意思是 OTP 早于用户已经通过身份验证的 OTP,那么是的,这被认为是不好的做法。OTP 旨在使用一次,因此得名。2FA 的全部意义在于它代表了安全三位一体中的“你拥有的东西”。允许令牌被使用两次违背了 OTP 旨在防止的目的。把它变成“你知道的东西”,这使它成为第二个密码。
这个问题通常不会表现为蛮力问题。例如,在时间窗口相对较短的 TOTP 的情况下,暴力破解并没有真正用来规避它。对于允许重用 OTP(当前或过去)的站点,作为攻击者的用例是拦截。
如果客户端使用 OTP 并且以某种方式被拦截,则攻击者现在将问题归结为用户名密码。其中,如果他们正在拦截信息,则可能也在监听这些信息。
在 HOTP 的情况下,问题更严重,因为理论上计数器或移动因子不会经常增加。这意味着用户通过身份验证的最后一个甚至上一个 OTP 可能会在很长一段时间内有效。在某些情况下,取决于服务器的执行情况。
如果之前的意思是在当前生成但尚未使用的 OTP 之前或之前的 OTP,那么不,在限制范围内。OTP 的标准实现通常应用“窗口”来克服同步问题。在 TOTP 的情况下,使用了 5 秒的窗口(向前和向后),但是在我见过的任何实现中,这总是不允许在用户验证的最后一个或之前的任何 OTP。如果我们以 15 秒的移动步骤和 15 秒的窗口为例,在 45 秒的时间范围内,将有 3 个 OTP 可用于进行身份验证,一个在过去,一个现在,一个在未来(假设时间间隔相同)作为移动步骤)。这背后的原因在@cornelinux 的回答中得到了优雅的解释。
对于 HOTP,该窗口是一个“前瞻”窗口。如果用户验证的最后一个 OTP 在接受的前一个 OTP 的下 10 个 OTP 内,则允许该 OTP,然后实现从该 OTP 计算下一个 10,以检查输入的下一个 OTP。在成功使用之前忽略窗口中未使用的任何 OTP 具有相当好的意义。
笔记:
在 HOTP 10 中是任意的。通常这个因素大约是成功验证所需的 OTP 数量的 2.5 倍。因此,如果用户需要 3 个 HOTP 来进行身份验证,则该窗口将在当前一个之后大约 8 个 OTP。
在 TOTP 5 秒内也是可变的。在某些情况下,我看到的窗口大到 100% 的移动步长。因此,以 30 秒的步长和 30 秒的窗口有效地使代码在 1:30 有效。同样,在当前迭代之前和之后扩展。