import pyotp
import qrcode
secret = pyotp.random_base32()
totp = pyotp.TOTP(secret)
uri = totp.provisioning_uri("user@example.com", issuer_name="MyApp")
qrcode.make(uri).save("qrcode.png")TOTP (Time-based One-Time Password) est un mécanisme de génération de mots de passe à usage unique basés sur le temps.
Fournir une couche supplémentaire de sécurité pour l’authentification, souvent utilisée dans le cadre de l’authentification à deux facteurs (2FA).
Basé sur l’algorithme décrit dans la norme RFC 6238.
RFC 6238 — TOTP est un standard ouvert. Tous les générateurs (Google Auth, Authy, etc.) sont interopérables. |
Une clé partagée entre le serveur et l’utilisateur, généralement encodée en Base32.
Le temps est divisé en intervalles (souvent de 30 secondes).
Combinaison de la clé secrète et de l’horodatage.
Application de HMAC (Hash-based Message Authentication Code) avec une fonction de hachage (SHA-1, SHA-256, ou SHA-512).
Troncature pour obtenir un mot de passe d’une longueur définie (souvent 6 ou 8 chiffres).
Les mots de passe expirent rapidement, ce qui réduit le risque de réutilisation.
Les codes TOTP peuvent être générés localement sur l’appareil de l’utilisateur, sans connexion Internet.
Compatible avec de nombreux systèmes et applications grâce à la norme RFC 6238.
Authentification à deux facteurs (2FA) : Utilisé dans les systèmes comme Google, Microsoft, et d’autres pour sécuriser les comptes.
Protéger l’accès à des serveurs, applications, et systèmes critiques.
Compatible avec des applications comme Google Authenticator, Microsoft Authenticator, et Authy.
Générée par le serveur et partagée avec l’utilisateur. Encodée en Base32 pour la lisibilité humaine.
Utilisé pour partager la clé secrète avec une application TOTP.
import pyotp
import qrcode
secret = pyotp.random_base32()
totp = pyotp.TOTP(secret)
uri = totp.provisioning_uri("user@example.com", issuer_name="MyApp")
qrcode.make(uri).save("qrcode.png")Scannez le QR Code avec une application comme Google Authenticator. Vérification des codes :
Le serveur doit calculer le même code pour valider l’entrée de l’utilisateur. Exemple avec pyotp :
if totp.verify(user_input_code):
print("Code valide !")
else:
print("Code invalide.")Les horloges du serveur et de l’utilisateur peuvent ne pas être synchronisées.
Tolérance de temps (souvent ±1 intervalle de temps).
Problème : Si la clé est compromise, la sécurité est brisée.
Solution : Stocker la clé dans un environnement sécurisé (HSM ou modules de gestion de secrets).
Préférer TOTP au SMS : le SMS est vulnérable au SIM swapping (l’attaquant fait transférer votre numéro sur sa carte SIM). |
Ne jamais stocker la clé en texte clair.
Utiliser des solutions de gestion de secrets.
Permettre à l’utilisateur de récupérer l’accès en cas de perte de l’appareil.
Assurez-vous que le TOTP est utilisé comme un facteur additionnel (2FA), pas comme la seule méthode d’authentification.
Basé sur un compteur incrémental.
Générateur physique de codes TOTP.
Google Authenticator, Authy, FreeOTP.
Générer un code TOTP (Python) :
import pyotp
totp = pyotp.TOTP("JBSWY3DPEHPK3PXP")
print(totp.now())RFC 6238 - TOTP
Bibliothèque PyOTP pour Python
TOTP est le standard de fait pour la MFA grand public et entreprise — simple, sûr, gratuit, partout disponible. |
Pour une sécurité encore supérieure : FIDO2 / WebAuthn avec clé matérielle (YubiKey, Titan Key).
Voir aussi : Sécuriser ses accès · Moindre privilège · Kerberos · Profil numérique |