J'essaie d'utiliser des mots de passe à usage unique qui peuvent être générés à l'aide de l' application Google Authenticator .
Ce que fait Google Authenticator
Fondamentalement, Google Authenticator implémente deux types de mots de passe:
- HOTP - Mot de passe à usage unique basé sur HMAC, ce qui signifie que le mot de passe est modifié à chaque appel, conformément à la RFC4226 , et
- TOTP - Mot de passe à usage unique basé sur le temps, qui change toutes les 30 secondes (pour autant que je sache).
Google Authenticator est également disponible en Open Source ici: code.google.com/p/google-authenticator
Code actuel
Je cherchais des solutions existantes pour générer des mots de passe HOTP et TOTP, mais je n'ai pas trouvé grand-chose. Le code que j'ai est l'extrait de code suivant responsable de la génération de 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
Le problème auquel je suis confronté est que le mot de passe que je génère à l'aide du code ci-dessus n'est pas le même que celui généré à l'aide de l'application Google Authenticator pour Android. Même si j'ai essayé plusieurs intervals_no
valeurs (exactement les 10000 premiers, en commençant par intervals_no = 0
), secret
étant égal à la clé fournie dans l'application GA.
Questions que j'ai
Mes questions sont:
- Qu'est-ce que je fais mal?
- Comment puis-je générer HOTP et / ou TOTP en Python?
- Existe-t-il des bibliothèques Python pour cela?
Pour résumer: veuillez me donner tous les indices qui m'aideront à mettre en œuvre l'authentification Google Authenticator dans mon code Python.