Я пытаюсь использовать одноразовые пароли, которые можно сгенерировать с помощью приложения Google Authenticator .
Что делает Google Authenticator
По сути, Google Authenticator реализует два типа паролей:
- HOTP - одноразовый пароль на основе HMAC, что означает, что пароль меняется при каждом вызове в соответствии с RFC4226 , и
- TOTP - Time-based One-Time Password, который меняется каждые 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. Несмотря на то, что я пробовал несколько intervals_no
значений (ровно первые 10000, начиная с intervals_no = 0
), secret
они были равны ключу, указанному в приложении GA.
Вопросы у меня есть
Мои вопросы:
- Что я делаю не так?
- Как я могу сгенерировать HOTP и / или TOTP в Python?
- Существуют ли для этого какие-нибудь библиотеки Python?
Подводя итог: дайте мне любые подсказки, которые помогут мне реализовать аутентификацию Google Authenticator в моем коде Python.