Python pyotp在生产中有时会失败
我正在使用。但它在生产中有时会失败。为了复制它,我编写了以下测试:Python pyotp在生产中有时会失败,python,Python,我正在使用。但它在生产中有时会失败。为了复制它,我编写了以下测试: import pyotp from time import sleep key = pyotp.random_base32() for i in range(10): otp = pyotp.TOTP(key).now() sleep(5) print pyotp.TOTP(key).verify(otp) 样本输出为: True False True True True True True False True
import pyotp
from time import sleep
key = pyotp.random_base32()
for i in range(10):
otp = pyotp.TOTP(key).now()
sleep(5)
print pyotp.TOTP(key).verify(otp)
样本输出为:
True
False
True
True
True
True
True
False
True
True
我无法调试这里出了什么问题,因为它工作了8/10次。为什么它失败了2/10
谢谢,我不熟悉
pyotp
,但在浏览时,我发现:
def timecode(self, for_time):
i = time.mktime(for_time.timetuple())
print(i, i/self.interval)
return int(i / self.interval)
timecode
用于比较不同的“otp”是否相同<代码>间隔的默认值为30
可能的想法是,在30秒内,散列结果是相同的。不幸的是,这种编码方式似乎不起作用:它需要一些绝对时间(好吧,w.r.t.1970),并将其划分为30秒的间隔。timecode
的结果是自1970年以来的30秒间隔量。当然,一旦时钟通过*:00
或*:30
,新的30秒间隔将开始,并出现不匹配。睡眠时间为5秒,10次试验,你的程序需要50秒,因此它几乎是30秒界限的2倍;因此,当四舍五入为整数值时,10分之2(将睡眠时间增加到6秒,对于较大的样本,10分之2正好)
正如我所提到的,我不知道pyotp
,但这似乎不是故意的,应该是一个正在比较的间隔(datetime.timedelta
)。我刚刚注意到了,所以请随意提供一个链接到这个答案
同时,也许你应该避免TOTP而使用另一个类;或者根据您的需要设置非常长的时间间隔(例如,TOTP(key,interval=315360000)
,即10年)