rubygemrotp在到期时间间隔之前到期

q0qdq0h2  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(319)

我正在建立一个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的预期行为?

ttvkxqim

ttvkxqim1#

生成的一次性pad在令牌中没有内置过期。也就是说: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-详细信息请参阅基于时间的otp-with-drift。

相关问题