我正在尝试使用可以使用Google Authenticator application生成的一次性密码。
Google 身份验证器的作用
基本上,Google Authenticator 实现了两种类型的密码:
- HOTP - 基于 HMAC 的一次性密码,这意味着每次调用都会更改密码,符合RFC4226和
- TOTP - 基于时间的一次性密码,每 30 秒更改一次(据我所知)。
Google Authenticator 也可在此处作为开源获得: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 身份验证的线索。