0

我正在构建一个 OTP 并实现了 ROTP gem。然而,ROTP 的行为并不是我所期望的。

例如,当请求一个间隔为 30 秒的 ROTP 时

at 15:00:14, this will return you an OTP say 212321
at 15:00:30, however, this will return you a new OTP say 312932

注意它没有达到 30 秒的到期时间,但已经返回给你一个新的 otp

我对基于时间的 OTP 的预期行为是

at 15:00:14, this will return you an OTP say 212321
at 15:00:30, will still return 212321
at 15:00:44, will return a new OTP because it has reached the 30 secs of expiry interval

如何实现基于时间的 OTP 的预期行为?

4

1 回答 1

1

生成的一次性便笺在令牌中没有内置的过期时间。即:TOTP 算法确保在某个固定的时间范围内,生成相同的令牌。

在您的情况下,212321令牌从 15:00:00 到 15:00:29 有效,无论您在此时间范围内何时生成它。在 15:00:30,一个新的时间段开始,您生成的令牌将312932保持该值,直到 15:00:59。这是RFC 6238中定义的 TOTP 算法所固有的。

此行为很重要,因为检查令牌有效性的服务器将使用完全相同的算法为当前时隙生成令牌并将其与客户端提供的令牌进行比较。根据客户提供令牌的确切时间,您有更多或更少的回旋余地。

为了允许一些时钟漂移并提供更好的可用性,rotp gem验证器组件有一个drift_behind值选项,以在一段时间内仍然允许技术上过期的令牌。有关详细信息,请参阅https://github.com/mdp/rotp#verifying-a-time-based-otp-with-drift

于 2021-07-22T12:16:57.823 回答