Générez et vérifiez des mots de passe à usage unique basés sur le temps (TOTP) à partir d'un secret base32. Compatible avec Google Authenticator et la RFC 6238.
Mots de passe à usage unique, RFC 6238. Générez le TOTP actuel pour un secret base32 et vérifiez un code que vous avez reçu. Le compteur est dérivé de l'heure courante, donc les codes sont renouvelés toutes les 30 ou 60 secondes. Fonctionne entièrement dans votre navigateur.
------
Vérifier un code
Comment fonctionne le TOTP
Un secret partagé plus l'horloge
Le TOTP est défini dans la RFC 6238 et est une fine couche au-dessus du HOTP. Les deux parties détiennent le même secret, généralement fourni une fois sous forme de QR code et stocké dans une application d'authentification. Pour produire un code, chaque partie prend l'heure Unix courante, la divise par la taille du pas (30 secondes par défaut) pour obtenir un compteur, calcule le HMAC-SHA1 de ce compteur sous le secret, et tronque le résultat au nombre de chiffres requis.
Comme le compteur provient de l'horloge plutôt que d'un message, rien ne doit circuler entre les deux parties après l'enrôlement. Le serveur n'envoie pas de défi et l'application n'a pas besoin d'accès réseau — c'est pourquoi les applications d'authentification fonctionnent en mode avion.
Troncature et nombre de chiffres
La sortie HMAC fait 20 octets, bien plus qu'un code à 6 chiffres. La troncation dynamique utilise le nibble bas du dernier octet comme décalage, lit quatre octets à partir de là, masque le bit de poids fort pour éviter tout problème de signe, et prend ce nombre modulo 10^chiffres. Utiliser un décalage variable plutôt que fixe signifie qu'un attaquant ne peut pas concentrer son analyse sur une tranche connue du digest.
Six chiffres constituent la valeur par défaut quasi universelle. Huit chiffres sont pris en charge par la plupart des applications et offrent environ deux chiffres décimaux supplémentaires de résistance au devinage, ce qui compte beaucoup moins que la limitation du débit — un code à 6 chiffres a une chance sur un million par essai, la vraie défense est donc de verrouiller après quelques échecs.
Dérive d'horloge et rejeu
Les appareils dérivent. Les serveurs acceptent normalement le code de la fenêtre précédente et de la suivante ainsi que celui de la fenêtre courante, offrant une tolérance de ±30 secondes. Dépasser une à deux minutes commence à augmenter sensiblement la surface d'attaque et signale généralement qu'il faut plutôt corriger l'horloge d'un appareil.
Deux propriétés méritent d'être retenues lors du déploiement. Un code reste valide pendant toute sa fenêtre, donc un code intercepté peut être rejoué dans cette fenêtre à moins que le serveur ne marque les compteurs utilisés comme consommés. Et le secret est symétrique : celui qui détient la copie côté serveur peut générer des codes valides indéfiniment, il nécessite donc la même protection qu'une base de données de mots de passe — chiffrée au repos, jamais journalisée, jamais dans un dépôt git.
C'est utile pour tester et pour récupérer un code quand votre téléphone n'est pas disponible, mais un onglet de navigateur n'est pas un endroit sûr pour conserver un secret partagé de longue durée.
Pourquoi mon code est-il rejeté ?
Presque toujours à cause de la dérive d'horloge. Le TOTP dérive le code de l'heure UNIX courante, donc un appareil décalé de plus d'une étape de 30 secondes par rapport au serveur produit un code que le serveur a déjà dépassé.
Que représente le secret Base32 ?
C'est la clé partagée détenue par les deux parties. Base32 est utilisé car il est insensible à la casse et évite les caractères ambigus, ce qui le rend pratique à taper ou à encoder dans un QR code.
Pourquoi les codes font-ils six chiffres ?
La RFC 6238 tronque le HMAC en une valeur de 31 bits et prend le modulo 10^6. Six chiffres équilibrent la convivialité et une probabilité de devinage d'une chance sur un million par essai, ce que la limitation du débit réduit encore.
Quelle est la différence entre TOTP et HOTP ?
TOTP compte des pas de temps de 30 secondes ; HOTP compte des événements et n'avance que lorsqu'un code est utilisé. TOTP nécessite des horloges synchronisées, HOTP nécessite des compteurs synchronisés.
Le même code peut-il être utilisé deux fois ?
Il ne devrait pas. Un code reste valide pendant toute son étape de temps, le serveur est donc censé enregistrer quelle étape un utilisateur a déjà consommée et rejeter un rejeu.