Próbuję użyć haseł jednorazowych, które można wygenerować za pomocą aplikacji Google Authenticator .
Co robi Google Authenticator
Zasadniczo Google Authenticator implementuje dwa typy haseł:
- HOTP - jednorazowe hasło oparte na HMAC, co oznacza, że hasło jest zmieniane przy każdym połączeniu, zgodnie z RFC4226 , oraz
- TOTP - jednorazowe hasło czasowe, które zmienia się co 30 sekund (o ile wiem).
Google Authenticator jest również dostępny jako Open Source tutaj: code.google.com/p/google-authenticator
Aktualny kod
Szukałem istniejących rozwiązań do generowania haseł HOTP i TOTP, ale niewiele znalazłem. Kod jaki posiadam to następujący fragment odpowiadający za generowanie 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
Problem polega na tym, że hasło wygenerowane za pomocą powyższego kodu nie jest tym samym, co wygenerowane za pomocą aplikacji Google Authenticator na Androida. Mimo że próbowałem wielu intervals_no
wartości (dokładnie pierwszych 10000, zaczynając od intervals_no = 0
), z secret
równością klucza dostarczonego w aplikacji GA.
Mam pytania
Moje pytania to:
- Co ja robię źle?
- Jak mogę wygenerować HOTP i / lub TOTP w Pythonie?
- Czy istnieją do tego jakieś biblioteki Pythona?
Podsumowując: proszę o wskazówki, które pomogą mi zaimplementować uwierzytelnianie Google Authenticator w moim kodzie Pythona.