我正在尝试使用可以使用Google身份验证器应用程序生成的一次性密码.
基本上,Google身份验证器实现了两种类型的密码:
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
Run Code Online (Sandbox Code Playgroud)
我面临的问题是,我使用上述代码生成的密码与使用适用于Android的Google身份验证器应用生成的密码不同.即使我尝试了多个intervals_no值(恰好是前10000个,开头intervals_no = 0),与secretGA应用程序中提供的密钥相等.
我的问题是:
总结一下:请给我任何有助于我在Python代码中实现Google身份验证器身份验证的线索.
python security authentication one-time-password google-authenticator
我有两个字符串(键和数据),它们是十六进制字符串格式,我想接受它们的HMAC.字符串是:
$data = "0000000002ccbe80";
$key = "48656c6c6f21deadbeef";
Run Code Online (Sandbox Code Playgroud)
我想生成相当于javascript jsSHA函数,其中字符串被视为十六进制字符串.此演示http://caligatio.github.io/jsSHA/允许您指定密钥和数据是HEX字符串.
但是,当我hmac_sha1_hex($data, $key)在Perl中使用时,字符串被视为文本.我得到了hmac_sha1_hex的输出:
775083be8f8c94baea8d12a5038d191cab3759ac
Run Code Online (Sandbox Code Playgroud)
如何生成与jsSHA演示相同的输出,其中两个输入都被视为十六进制,输出也是十六进制?我想要这个输出:
f2ea4899a8582c21610085988c54645fd7193393
Run Code Online (Sandbox Code Playgroud)