J'essaye d'utiliser des mots de passe à usage unique qui peuvent être générés à l'aide de Application Google Authenticator .
Ce que fait Google Authenticator
Fondamentalement, Google Authenticator met en œuvre deux types de mots de passe :
- HOTP - Mot de passe unique basé sur le code HMAC, ce qui signifie que le mot de passe est changé à chaque appel, conformément à la directive sur la protection des données. RFC4226 et
- TOTP - Mot de passe 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 dont je dispose est le snippet 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 que je rencontre est que le mot de passe que je génère en utilisant le code ci-dessus n'est pas le même que celui généré par l'application Google Authenticator pour Android. Même si j'ai essayé plusieurs fois intervals_no
(exactement les 10000 premières valeurs, en commençant par intervals_no = 0
), avec secret
étant égale à la clé fournie dans l'application GA.
Questions que je me pose
Mes questions sont les suivantes :
- Qu'est-ce que je fais de mal ?
- Comment puis-je générer HOTP et/ou TOTP en Python ?
- Existe-t-il des bibliothèques Python pour cela ?
En résumé, veuillez me donner tout indice qui m'aidera à mettre en œuvre l'authentification Google Authenticator dans mon code Python.