Le second facteur et les codes à usage unique

HOTP et TOTP : les codes à 6 chiffres

Le second facteur le plus répandu est le code à six chiffres qui change toutes les trente secondes, affiché par une application d'authentification. Derrière cette simplicité se cachent deux standards : HOTP et TOTP.

HOTP : un code lié à un compteur

HOTP (HMAC-based One-Time Password, RFC 4226) produit un code à usage unique à partir de deux ingrédients partagés entre le serveur et l'appareil de l'utilisateur :

  • un secret partagé, tiré une seule fois à l'inscription ;
  • un compteur, incrémenté à chaque code généré.

Le cœur du calcul est une fonction HMAC (un code d'authentification de message fondé sur une fonction de hachage). Le résultat, long et illisible, est tronqué pour donner six chiffres saisissables par un humain.

secret + compteur ---> HMAC ---> troncature ---> 123456

Le compteur garantit qu'un code n'est valable qu'une fois. Mais il pose un problème de synchronisation : si l'appareil et le serveur ne comptent plus pareil (un code généré non utilisé), ils divergent.

TOTP : le temps à la place du compteur

TOTP (Time-based One-Time Password, RFC 6238) résout ce problème en remplaçant le compteur par le temps courant. Concrètement, on divise l'horloge en fenêtres de trente secondes et on compte le nombre de fenêtres écoulées depuis une date de référence.

secret + (temps / 30 s) ---> HMAC ---> troncature ---> 6 chiffres

C'est la seule différence de fond avec HOTP : l'entrée variable n'est plus un compteur d'événements mais un compteur de fenêtres de temps. Le serveur et l'application, partageant le même secret et lisant la même horloge, calculent le même code sans jamais communiquer.

Le partage initial du secret

Tout repose sur le secret partagé au départ. À l'inscription, le service affiche un QR code qui encode ce secret ; l'application le scanne et le mémorise. Dès lors, les deux côtés peuvent générer le même code à chaque instant.

+-----------+                         +----------------------+
| Serveur   |  --- QR (secret) --->   | Appli (téléphone)    |
| garde le  |                         | garde le même secret |
| secret S  |                         | S                    |
+-----------+                         +----------------------+
     |   chaque 30 s, chacun calcule   |
     |   TOTP(S, temps) de son côté    |
     v                                 v
   123456          ==                123456

La faiblesse : l'hameçonnage

TOTP protège contre les fuites de mots de passe : voler la base ne suffit plus. Mais il reste vulnérable à l'hameçonnage en temps réel. Un faux site imite la page de connexion, demande le mot de passe et le code à six chiffres, puis les rejoue immédiatement sur le vrai site. Le code est valide trente secondes : c'est assez pour l'attaquant.

La cause profonde : le code est une simple valeur que l'utilisateur recopie, sans lien avec le site qui la reçoit. Rien n'empêche de la saisir au mauvais endroit.

En résumé

  • HOTP dérive un code d'un secret et d'un compteur via HMAC, puis tronque à six chiffres.
  • TOTP remplace le compteur par le temps (fenêtres de 30 s) ; c'est le code des applis d'authentification.
  • Le secret est partagé au départ par QR code ; il reste vulnérable à l'hameçonnage.