Sto cercando di utilizzare password monouso che possono essere generate utilizzando l' applicazione Google Authenticator .
Cosa fa Google Authenticator
Fondamentalmente, Google Authenticator implementa due tipi di password:
- HOTP - One-Time Password basata su HMAC, il che significa che la password viene modificata a ogni chiamata, in conformità a RFC4226 , e
- TOTP : password monouso basata sul tempo, che cambia ogni 30 secondi (per quanto ne so).
Google Authenticator è anche disponibile come Open Source qui: code.google.com/p/google-authenticator
Codice corrente
Stavo cercando soluzioni esistenti per generare password HOTP e TOTP, ma non ho trovato molto. Il codice che ho è il seguente frammento responsabile della generazione di 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
Il problema che sto affrontando è che la password generata utilizzando il codice sopra non è la stessa generata utilizzando l'app Google Authenticator per Android. Anche se ho provato più intervals_no
valori (esattamente il primo 10000, a partire da intervals_no = 0
), con l' secret
essere uguale alla chiave fornita all'interno dell'app GA.
Domande che ho
Le mie domande sono:
- Che cosa sto facendo di sbagliato?
- Come posso generare HOTP e / o TOTP in Python?
- Esistono librerie Python esistenti per questo?
Per riassumere: per favore dammi qualche indizio che mi aiuterà a implementare l'autenticazione di Google Authenticator all'interno del mio codice Python.