我正在尝试使用可以通过Google Authenticator应用程序生成的一次性密码。
Google身份验证器的功能
基本上,Google身份验证器实现两种类型的密码:
- HOTP-基于HMAC的一次性密码,这意味着密码会在每次呼叫时更改,以符合RFC4226的要求,并且
- TOTP-基于时间的一次性密码,每30秒更改一次(据我所知)。
Google身份验证器也可以在此处作为开源使用:code.google.com/p/google-authenticator
当前代码
我一直在寻找用于生成HOTP和TOTP密码的现有解决方案,但没有找到太多。我拥有的代码是负责生成HOTP的以下代码段:
import hmac, base64, struct, hashlib, time
def get_token(secret, digest_mode=hashlib.sha1, intervals_no=None):
if intervals_no == None:
intervals_no = int(time.time()) // 30
key = base64.b32decode(secret)
msg = struct.pack(">Q", intervals_no)
h = hmac.new(key, msg, digest_mode).digest()
o = ord(h[19]) & 15
h = (struct.unpack(">I", h[o:o+4])[0] & 0x7fffffff) % 1000000
return h
我面临的问题是,使用上述代码生成的密码与使用Android的Google Authenticator应用生成的密码不同。即使我努力过多个intervals_no
值(第一完全相同10000,开头intervals_no = 0
),以secret
等于在GA的应用程序内提供的密钥。
我有问题
我的问题是:
- 我究竟做错了什么?
- 如何在Python中生成HOTP和/或TOTP?
- 有没有现成的Python库?
总结一下:请给我提供一些线索,这些线索将有助于我在Python代码中实现Google Authenticator身份验证。