Comment fonctionnent les codes TOTP
Un code TOTP est un nombre à 6 chiffres qu’une application d’authentification et un serveur calculent chacun de leur côté, à partir des deux mêmes entrées : une clé secrète partagée et l’heure actuelle, découpée en fenêtres de 30 secondes. Le code lui-même n’est jamais transmis pendant la configuration et ne transporte aucune information sur le secret, et pourtant les deux parties arrivent aux mêmes chiffres — car TOTP n’est ni magie ni hasard : c’est un algorithme publié (RFC 6238) appliqué aux mêmes entrées. Cet article parcourt le calcul de bout en bout, explique pourquoi un « code incorrect » est presque toujours un problème d’horloge, et passe en revue les règles de manipulation qui décident si votre second facteur reste un second facteur. Vous pouvez exécuter chaque étape vous-même dans le générateur TOTP, qui calcule les codes localement dans votre navigateur.
Deux entrées, un code : le secret et l’horloge
Quand vous activez l’authentification à deux facteurs, le service génère un secret aléatoire — généralement 20 octets, qui vous est montré sous forme d’une chaîne de caractères Base32 et, par commodité, encodé dans un QR code. Ce secret est conservé à exactement deux endroits : la base de données du service et votre authentificateur. À partir de cet instant, la connexion devient un calcul synchronisé. Les deux parties prennent l’heure Unix actuelle, la divisent par le pas de temps (30 secondes pour presque tous les services) et alimentent le compteur résultant, avec le secret, dans une fonction de hachage. Quiconque présente la sortie correspondante est traité comme détenteur du secret.
L’élégance du dispositif tient à ce qu’il laisse de côté. Il n’y a pas de défi à envoyer, pas de code à livrer, pas d’aller-retour réseau, et rien à intercepter à chaque connexion : la propriété « à usage unique » vient de l’horloge, car le compteur change toutes les 30 secondes et les anciennes sorties deviennent sans valeur. Cela signifie aussi que le système a exactement deux choses qui peuvent mal tourner — le secret et l’heure. Presque toutes les pannes TOTP, et tous les vols TOTP, remontent à l’une des deux.
Le calcul, étape par étape
Le compteur est d’abord écrit sous forme d’entier big-endian de 8 octets — un encodage à largeur fixe sur lequel les deux parties s’accordent. Ce message passe ensuite dans HMAC avec le secret comme clé, en utilisant le hachage convenu : SHA-1 par défaut, SHA-256 et SHA-512 étant définis pour les services qui les choisissent. HMAC est une construction à clé, pas un simple hachage : hacher le seul compteur permettrait à quiconque connaît l’algorithme de reproduire les codes, alors que les sorties HMAC sont infalsifiables sans le secret et ne peuvent pas être inversées pour le retrouver.
Un condensat fait 20 octets ou plus ; un champ de connexion veut 6 chiffres. Le pont est la troncature dynamique : le dernier demi-octet du condensat sélectionne un décalage, quatre octets sont lus à partir de ce décalage avec le bit de poids fort masqué (pour éviter l’ambiguïté de signe), et le nombre de 31 bits résultant est réduit modulo 10^chiffres — un million pour les six chiffres standard —, complété par des zéros à gauche. C’est le code que vous tapez. La fenêtre suivante recalcule depuis zéro ; aucune chaîne ne relie un code au suivant, et c’est pourquoi un code photographié ne vaut plus rien trente secondes plus tard.
Quand le code est rejeté : c’est le plus souvent l’horloge
Comme le compteur est dérivé du temps, le générateur et le serveur doivent s’accorder sur la fenêtre de 30 secondes en cours. La plupart des serveurs adoucissent cela en acceptant aussi les fenêtres voisines — un pas de chaque côté —, ce qui absorbe silencieusement les petites dérives. Au-delà, tous les codes sont faux, aussi correct que soit le secret, et l’échec ressemble trait pour trait à un chiffre mal tapé : un rejet net, sans le moindre indice sur l’entrée en désaccord.
Le premier diagnostic face à un authentificateur qui tombe soudain en panne n’est donc jamais le secret ; c’est l’horloge de l’appareil qui génère les codes. Une heure réglée à la main, une pile CMOS mourante, un téléphone qui a passé un vol dans le mauvais mode de fuseau horaire — chacun peut faire dériver l’appareil d’une minute ou plus. Notre générateur TOTP affiche une carte d’horloge en direct et compare votre appareil à l’heure du serveur exactement pour cela. Activez la date et l’heure automatiques, et les codes se remettent presque toujours à fonctionner — sans réinitialisation, sans nouveau secret, sans ticket d’assistance.
Le secret est tout l’enjeu
Une fois la cérémonie retirée, la sécurité TOTP tient en un fait : quiconque possède le secret possède le second facteur, pour toujours, de n’importe où, sans que le service puisse distinguer ses codes des vôtres. Le QR code que vous scannez à la configuration n’est pas l’image d’un code — c’est le secret lui-même, plus l’étiquette du compte et les paramètres, formaté en URI otpauth://. Une capture d’écran de ce QR code est une copie permanente de votre second facteur.
C’est pourquoi les règles de manipulation sont plus strictes que pour les mots de passe. Un mot de passe est vérifié par le serveur et peut être stocké haché ; un secret TOTP doit pouvoir être récupéré sous forme brute par les deux parties, il ne peut donc pas être dissous par un hachage, et chaque copie est une copie vivante. Gardez la copie maîtresse dans votre authentificateur ou un gestionnaire de mots de passe chiffré. Ne le tapez jamais sur un site web qui génère les codes sur son serveur — vous avez remis une clé permanente à un inconnu — et ne le collez jamais dans un chat, comme l’explique la section suivante.
Pourquoi le secret ne doit jamais aller dans un chat
Coller un secret 2FA dans un chat — une conversation d’assistance, un canal d’équipe, un assistant IA — semble inoffensif parce que la chaîne ressemble à du charabia et que la conversation semble privée. Ce n’est ni l’un ni l’autre. Les chats sont journalisés, conservés, synchronisés sur chaque appareil du compte, interrogeables, et traités sur des serveurs que vous ne contrôlez pas ; les chats IA ajoutent à la liste les chaînes d’entraînement et la longue conservation. Dès que le secret y atterrit, votre second facteur existe dans des systèmes conçus pour conserver et indexer du texte.
Le schéma sûr est que le secret ne devrait exister qu’en trois types d’endroits : la base de données du service, votre authentificateur ou gestionnaire de mots de passe, et le calcul local sur un appareil que vous contrôlez — c’est ainsi qu’est construit le générateur TOTP de ce site, avec le secret gardé dans la seule mémoire de la page et détruit au rechargement. Si un secret a déjà été collé là où il ne devait pas, traitez-le comme brûlé : désactivez puis réactivez l’authentification à deux facteurs auprès du service pour en frapper un nouveau, réinscrivez votre authentificateur, et profitez-en pour vérifier le mot de passe lui-même dans la vérification de fuites de mots de passe.
Ce que TOTP n’arrête pas
TOTP défait le vol de mots de passe, le bourrage d’identifiants et les fuites de bases de données : connaître votre mot de passe ne suffit plus. Il ne défait pas le phishing en temps réel. Une fausse page de connexion qui relaie vos identifiants vers le vrai service et vous demande le code peut transmettre le code dans sa fenêtre de 30 secondes — le code prouve la possession du secret, pas que vous parlez au site authentique. Le vol du cookie de session le contourne tout aussi complètement, car le code n’est vérifié qu’une fois.
C’est pourquoi les passkeys et les clés de sécurité matérielles déplacent TOTP dans le haut de gamme : elles lient la preuve à l’origine du site, ne laissant rien de tapable qu’un relais puisse voler. TOTP reste une base solide et universelle — très supérieure aux codes SMS, qui héritent des faiblesses du réseau téléphonique —, mais il doit être déployé les yeux ouverts : protégez le secret comme une clé maîtresse, gardez les codes de secours à un endroit séparé, gardez votre horloge honnête, et préférez une passkey chaque fois que le service en propose une.