Реализация Google Authenticator на Python

Я пытается использовать одноразовые пароли, которые можно сгенерировать с помощью приложения Google Authenticator .

Что делает Google Authenticator

По сути, 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

Проблема, с которой я столкнулся, заключается в том, что пароль, который я генерирую с помощью приведенного выше кода, не совпадает с паролем, сгенерированным с помощью приложения Google Authenticator для Android. Несмотря на то, что я пробовал несколько значений interval_no (ровно первые 10000, начиная с interval_no = 0 ), при этом secret равен ключу, предоставленному в приложении GA.

У меня есть вопросы

Мои вопросы:

  1. Что я делаю не так?
  2. Как я могу сгенерировать HOTP и / или TOTP в Python?
  3. Существуют ли для этого какие-нибудь библиотеки Python?

Подводя итог: дайте мне какие-либо подсказки, которые помогут мне реализовать аутентификацию Google Authenticator в моем коде Python.

98
задан Tadeck 16 December 2011 в 03:52
поделиться