相关疑难解决方法(0)

Python中的Google身份验证器实现

我正在尝试使用可以使用Google身份验证器应用程序生成的一次性密码.

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
Run Code Online (Sandbox Code Playgroud)

我面临的问题是,我使用上述代码生成的密码与使用适用于Android的Google身份验证器应用生成的密码不同.即使我尝试了多个intervals_no值(恰好是前10000个,开头intervals_no = 0),与secretGA应用程序中提供的密钥相等.

我有问题

我的问题是:

  1. 我究竟做错了什么?
  2. 如何在Python中生成HOTP和/或TOTP?
  3. 是否有任何现有的Python库?

总结一下:请给我任何有助于我在Python代码中实现Google身份验证器身份验证的线索.

python security authentication one-time-password google-authenticator

99
推荐指数
2
解决办法
4万
查看次数

在Perl中使用六角形字符串的SHA1 HMAC

我有两个字符串(键和数据),它们是十六进制字符串格式,我想接受它们的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)

perl hex hmacsha1

2
推荐指数
1
解决办法
1274
查看次数