Я намагаюся використовувати одноразові паролі, які можна створити за допомогою програми Google Authenticator .
Що робить Google Authenticator
В основному, Google Authenticator реалізує два типи паролів:
- HOTP - одноразовий пароль на основі HMAC, який означає, що пароль змінюється під час кожного дзвінка відповідно до RFC4226 та
- TOTP - одноразовий пароль на основі часу, який змінюється кожні 30 секунд (наскільки я знаю).
Google Authenticator також доступний як Open Source тут: 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.