HOTP
HOTP (HMAC-based One-Time Password, RFC 4226) est la variante basée sur compteur de TOTP. Là où TOTP avance sur une horloge, HOTP avance sur un compteur partagé que le token et le serveur incrémentent à chaque code utilisé. HOTP est le mode canonique pour YubiKey OATH, les tokens matériels hérités et quelques flux bancaires où le serveur ne peut pas compter sur la synchronisation d'horloge.
URI scheme:Google Authenticator Key URI Format, the
otpauth:// scheme every authenticator agrees on. Sibling spec:TOTP (RFC 6238), time-based variant that builds on HOTP.
Ce que c'est
An HOTP enrolment QR is a URL in the otpauth:// scheme with hotp as the type. It carries the shared HMAC secret plus a counter value that both sides must keep in sync. Format:
otpauth://hotp/LABEL?secret=SECRET&issuer=ISSUER&counter=N&digits=N&algorithm=ALG- LABEL,
Issuer:Account, URL-encoded. Example:YubiKey:alice@example.com. - secret, the shared HMAC key, Base32-encoded (RFC 4648 §6: A-Z, 2-7).
- counter, starting counter value. Usually
0, but can be resumed from a known value when re-enrolling a token. - issuer, the service name shown in the authenticator app.
- digits,
6(default) or8. RFC 4226 §5.3 specifies 6; 8 is a common extension. - algorithm,
SHA1in practice. RFC 4226 only defines SHA1; SHA256/512 variants are RFC 6238 extensions bolted on after-the-fact.
HOTP vs TOTP, quand utiliser lequel
| Propriété | HOTP (RFC 4226) | TOTP (RFC 6238) |
|---|---|---|
| Avance sur | Compteur | Horloge (toutes les 30 s) |
| Nécessite sync horloge | Non | Oui, dans ~30 s de dérive |
| Resynchronisation sur dérive | Le serveur accepte les N valeurs de compteur suivantes | Le serveur accepte ±1 fenêtre |
| Déploiement typique | YubiKey, tokens matériels hérités, banque hors ligne | Tout 2FA grand public, Google, Microsoft, 1Password, Authy |
| Réutilisation du compteur | Catastrophique, fuite du secret au fil du temps | N/A |
| Vulnérabilité si secret compromis | Tous les codes futurs prédictibles | Tous les codes passés + futurs prédictibles |
Vecteurs de test canoniques
RFC 4226 Appendix D provides reference HOTP values for the secret 12345678901234567890 (20 bytes, Base32 GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ) with 6-digit output:
| Counter | HOTP (6-digit) |
|---|---|
0 | 755224 |
1 | 287082 |
2 | 359152 |
3 | 969429 |
4 | 338314 |
5 | 254676 |
6 | 287922 |
7 | 162583 |
8 | 399871 |
9 | 520489 |
Minimal QR payload for enrolment at counter 0:
otpauth://hotp/Example:test?secret=GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ&issuer=Example&counter=0Validateur de secret Base32 en direct
Same validator as the TOTP page, HOTP secrets use the identical Base32 alphabet (RFC 4648 §6: A-Z, 2-7). Runs in your browser, no server round-trip.
Pièges courants
- Désynchronisation du compteur. Si l'utilisateur appuie sur le bouton du token mais que le serveur n'enregistre pas le code (coupure réseau, double-clic), le compteur du token dépasse celui du serveur. Les serveurs gèrent cela avec une "fenêtre de resynchronisation", ils essaient les N prochaines valeurs de compteur avant de rejeter. La fenêtre par défaut de YubiKey est ~3 ; les déploiements haute sécurité la réduisent à 1.
- La réutilisation du compteur est catastrophique. N'acceptez jamais deux fois la même valeur de compteur. Si le serveur le fait, un attaquant qui a intercepté un code peut le rejouer plus tard. RFC 4226 §7.3 impose que le serveur refuse tout code égal ou inférieur au dernier compteur accepté.
- Export du compteur lors de la sauvegarde. Les apps d'authentification qui exportent les entrées HOTP exportent parfois le secret mais pas le compteur actuel. L'import dans un nouvel appareil repart du compteur à 0, désynchronisé du serveur, enrôlement effectivement cassé. TOTP est immunisé ; HOTP est fragile ici.
- Base32 n'est pas Base64. Même règle que TOTP : les secrets avec
0,1,8,9, lettres minuscules,+ou/sont en Base64 et seront rejetés par tout authentificateur conforme RFC. - SHA1 uniquement, en pratique. RFC 4226 définit SHA1 comme la fonction HMAC. SHA256/SHA512 sont des extensions de l'ère TOTP RFC 6238 ; la plupart des tokens matériels HOTP (dont YubiKey OATH) ne les implémentent pas.
- Le paramètre digits souvent ignoré. Beaucoup de tokens matériels sont fixés à 6 chiffres et tronquent silencieusement si vous demandez 8. Vérifiez avec votre matériel cible avant que le QR n'atteigne les cartes imprimées.
- Ne mélangez pas HOTP et TOTP dans le même QR. Le schéma URI utilise le segment
TYPE(hotpvstotp) pour changer de mode. Un unique secret peut alimenter les deux, mais cela signifie que les deux flux partagent le secret, si l'un est compromis, les deux échouent.
Compatibilité des apps d'authentification
| App / token | HOTP | SHA256/512 | 8 chiffres | Notes |
|---|---|---|---|---|
| YubiKey Authenticator (iOS/Android/bureau) | Oui | Oui | Oui | HOTP est le mode canonique YubiKey OATH. Support RFC 4226 complet. |
| Google Authenticator | Oui | Ignoré (SHA1 uniquement) | Ignoré (6 uniquement) | La référence de facto. Sûr pour HOTP mais avec 6 chiffres SHA1 uniquement. |
| 1Password | Oui | Oui | Oui | Support RFC complet. Le compteur est stocké et exporté avec l'entrée. |
| Bitwarden | Oui | Oui | Oui | Support RFC complet. |
| Microsoft Authenticator | Oui | Oui | Oui | Support RFC complet. |
| Authy | Non | , | , | HOTP supprimé dans les versions récentes. TOTP uniquement. |
| Duo Mobile | Non | , | , | Utilise son propre flux push ; fallback TOTP uniquement. |
| Tokens matériels OATH (Feitian, Token2, etc.) | Oui | Varie | Varie | Marché canonique HOTP matériel ; toujours 6 chiffres SHA1 sauf indication contraire dans la fiche technique. |
Voir aussi
- /hotp-qr-code/, le générateur HOTP avec validation compteur + Base32 en direct.
- /standards/totp/, le sibling basé sur le temps (RFC 6238).
- /totp-2fa-qr-code/, le générateur TOTP.
- /standards/, retour à l'index des standards.