Estoy intentando utilizar contraseñas de un solo uso que se pueden generar mediante la aplicación Google Authenticator .
Qué hace Google Authenticator
Básicamente, Google Authenticator implementa dos tipos de contraseñas:
- HOTP : contraseña de un solo uso basada en HMAC, lo que significa que la contraseña se cambia con cada llamada, de acuerdo con RFC4226 , y
- TOTP - Contraseña de un solo uso basada en el tiempo, que cambia cada 30 segundos (hasta donde yo sé).
Google Authenticator también está disponible como código abierto aquí: code.google.com/p/google-authenticator
Código actual
Estaba buscando soluciones existentes para generar contraseñas HOTP y TOTP, pero no encontré muchas. El código que tengo es el siguiente fragmento responsable de generar 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
El problema al que me enfrento es que la contraseña que genero con el código anterior no es la misma que la generada con la aplicación Google Authenticator para Android. Aunque probé varios intervals_no
valores (exactamente los primeros 10000, comenzando con intervals_no = 0
), secret
siendo igual a la clave proporcionada dentro de la aplicación GA.
Preguntas que tengo
Mis preguntas son:
- ¿Qué estoy haciendo mal?
- ¿Cómo puedo generar HOTP y / o TOTP en Python?
- ¿Existen bibliotecas de Python para esto?
En resumen: por favor, dame cualquier pista que me ayude a implementar la autenticación de Google Authenticator dentro de mi código Python.