gpt4 book ai didi

python - 如何在Python中结合使用base32和hotp(一次性密码)?

转载 作者:行者123 更新时间:2023-12-01 07:45:11 25 4
gpt4 key购买 nike

对于大学练习,我想用 python 开发一个简单的 hotp 服务器客户端系统。在这种情况下,客户端向服务器发送密码和一次性密码。服务器知道这个 secret ,计算当前的热点并比较它收到的值。到目前为止,一切都很好。对于纯文本,这工作得很好,并且计算值与我使用 iOS 应用程序“OTP Auth”时得到的值相同。但也可以结合 base32 来计算 OTP。因此,我添加了几行将明文编码为 Base32,但现在输出不正确。

假设我们使用 secret “1234”,因此明文输出将为“110366”。这正在发挥作用。但如果我将 secret 编码为 base32,输出应该是“807244”,但我的程序计算出“896513”。有人知道为什么会发生这种情况吗?

我已经尝试使用不同的 secret 并在不同的应用程序上检查了它。总是相同的结果。

import hmac
import hashlib
import array
import base64

counter = 0
digits = 6 #Anzahl der Zeichen

def hotp(secret, c):
global digits
counter = extendCounter(c)
hmac_sha1 = hmac.new(secret, counter, hashlib.sha1).hexdigest()
return truncate(hmac_sha1)[-digits:]


def truncate(hmac_sha1):
offset = int(hmac_sha1[-1], 16)
binary = int(hmac_sha1[(offset * 2):((offset * 2) + 8)], 16) & 0x7fffffff
return str(binary)


def extendCounter(long_num):
byte_array = array.array('B')
for i in reversed(range(0, 8)):
byte_array.insert(0, long_num & 0xff)
long_num >>= 8
return byte_array


def main():
secret = "1234"
bSecret = secret.encode("UTF-8")
bSecret = base64.b32encode(bSecret)
otp = hotp(bSecret, counter)
one_time_password = otp

我期望输出为 807244,但输出是 896513

最佳答案

首先,需要指出的是 secret.encode('UTF-8') 的结果与 base64.b32encode(bSecret)< 的结果具有完全相同的类型 (就此而言 base64.b64encode(bSecret))——它们都返回 bytes 对象。另外值得注意的是implementation of hmac Python中没有提到base64/base32编码。因此,简短的答案是,仅当共享 key 是 base64/UTF-8 编码的 blob 时,您预期的 807244 结果才有效。

这个快速片段表明,您实际上可以向 hotp 提供任何您喜欢的字节,它会产生一些结果(因为 hotp 在示例中被多次调用,计数器已更改)

# ... everything from your example above ...
secret = "1234"
secret_bytes = secret.encode("UTF-8")
secret_bytes
>>> b'1234'
b32_secret = base64.b32encode(bSecret)
b32_secret
>>> b'GEZDGNA='
b64_secret = base64.b64encode(bSecret)
b64_secret
>>> b'MTIzNA=='
hotp(secret_bytes, counter) # just a UTF-8 blob works
>>> '110366'
hotp(b32_secret, counter) # base32/UTF-8 also works
>>> '896513'
hotp(b64_secret, counter) # base64/UTF-8 works as well
>>> '806744'

如果您更详细地了解为什么您期望 Base32/UTF8 blob 为 807244,我很乐意修改此答案。

关于python - 如何在Python中结合使用base32和hotp(一次性密码)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56498074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com