HOTP
HOTP (HMAC-based One-Time Password, RFC 4226) is de teller-gebaseerde tegenhanger van TOTP. Waar TOTP op een klok vordert, vordert HOTP op een gedeelde teller die zowel de token als de server met elke gebruikte code verhogen.
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.
Wat het is
Een HOTP-inschrijvings-QR is een URL in het otpauth://-schema met hotp als type. Het bevat het gedeelde HMAC-geheim plus een tellerwaarde die beide partijen gesynchroniseerd moeten houden. Indeling:
otpauth://hotp/LABEL?secret=SECRET&issuer=ISSUER&counter=N&digits=N&algorithm=ALG- LABEL,
Issuer:Account, URL-gecodeerd. Voorbeeld:YubiKey:alice@example.com. - secret, de gedeelde HMAC-sleutel, Base32-gecodeerd (RFC 4648 §6: A-Z, 2-7).
- counter, beginwaarde van de teller. Gewoonlijk
0, maar kan worden hervat vanuit een bekende waarde bij herregistratie van een token. - issuer, de servicenaam weergegeven in de authenticator-app.
- digits,
6(standaard) of8. RFC 4226 §5.3 specificeert 6; 8 is een veelgebruikte uitbreiding. - algorithm, in de praktijk
SHA1. RFC 4226 definieert alleen SHA1; SHA256/512-varianten zijn RFC 6238-uitbreidingen.
HOTP vs TOTP, wanneer welke gebruiken
| Eigenschap | HOTP (RFC 4226) | TOTP (RFC 6238) |
|---|---|---|
| Vordert op | Teller (elke succesvolle gebruik) | Klok (elke 30 s) |
| Kloksynchronisatie vereist | Nee | Ja, binnen ~30 s afwijking |
| Resync bij drift | Server accepteert volgende N tellerwaarden | Server accepteert ±1 venster |
| Typische inzet | YubiKey, verouderde hardware-tokens, offline bankieren | Alle consument-2FA, Google, Microsoft, 1Password, Authy |
| Teller hergebruik | Catastrofaal, lekt geheim over tijd | N.v.t. |
| Kwetsbaarheid bij geheimlek | Alle toekomstige codes voorspelbaar | Alle verleden + toekomstige codes voorspelbaar |
Canonieke testvectoren
RFC 4226 Bijlage D levert referentie-HOTP-waarden voor het geheim 12345678901234567890 (20 bytes, Base32 GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ) met 6-cijferige uitvoer:
| Counter | HOTP (6-digit) |
|---|---|
0 | 755224 |
1 | 287082 |
2 | 359152 |
3 | 969429 |
4 | 338314 |
5 | 254676 |
6 | 287922 |
7 | 162583 |
8 | 399871 |
9 | 520489 |
Minimale QR-payload voor inschrijving bij teller 0:
otpauth://hotp/Example:test?secret=GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ&issuer=Example&counter=0Live Base32-geheimvalidator
Dezelfde validator als de TOTP-pagina, HOTP-geheimen gebruiken hetzelfde Base32-alfabet (RFC 4648 §6: A-Z, 2-7). Werkt in uw browser, geen serverrondrit.
Veelvoorkomende valkuilen
- Tellerdrift. Als de gebruiker op de tokenknop drukt maar de server de code niet opneemt, loopt de tellerteller voor op de serverteller. Servers verwerken dit met een 'resync-venster'.
- Tellerhergebruik is catastrofaal. Accepteer nooit dezelfde tellerwaarde twee keer. RFC 4226 §7.3 vereist dat de server codes afwijst bij of onder de als laatste geaccepteerde teller.
- Tellerexport tijdens backup. Authenticator-apps die HOTP-invoeren exporteren, exporteren soms het geheim maar niet de huidige teller. Importeren naar een nieuw apparaat herstart de teller bij 0.
- Base32, niet Base64. Dezelfde regel als TOTP: geheimen met
0,1,8,9, kleine letters,+of/zijn Base64 en worden door elke RFC-conforme authenticator afgewezen. - Alleen SHA1 in de praktijk. RFC 4226 definieert SHA1 als de HMAC-functie. SHA256/SHA512 zijn RFC 6238 TOTP-uitbreidingen; de meeste HOTP hardware-tokens implementeren ze niet.
- Cijferparameter vaak genegeerd. Veel hardware-tokens zijn vastgezet op 6 cijfers en kappen stilzwijgend af bij verzoek om 8. Controleer uw doelhardware voor het afdrukken van QR-kaarten.
- Meng HOTP en TOTP niet in dezelfde QR. Het URI-schema gebruikt het
TYPE(hotpvstotp)-segment om modi te schakelen. Eén geheim kan beide aandrijven, maar dan delen beide flows het geheim.
Authenticatorcompatibiliteit
| App / Token | HOTP | SHA256/512 | 8-cijferig | Opmerkingen |
|---|---|---|---|---|
| YubiKey Authenticator (iOS/Android/desktop) | Yes | Yes | Yes | HOTP is de canonieke YubiKey OATH-modus. Volledige RFC 4226-ondersteuning. |
| Google Authenticator | Yes | Genegeerd (alleen SHA1) | Genegeerd (alleen 6) | De facto-basislijn. Veilig voor HOTP maar alleen met 6-cijferig SHA1. |
| 1Password | Yes | Yes | Yes | Volledige RFC-ondersteuning. Teller opgeslagen en geëxporteerd met invoer. |
| Bitwarden | Yes | Yes | Yes | Volledige RFC-ondersteuning. |
| Microsoft Authenticator | Yes | Yes | Yes | Volledige RFC-ondersteuning. |
| Authy | No | , | , | HOTP verwijderd in recente versies. Alleen TOTP. |
| Duo Mobile | No | , | , | Gebruikt eigen push-flow; alleen TOTP als terugval. |
| OATH hardware tokens (Feitian, Token2, etc.) | Yes | Varies | Varies | Canonieke hardware-HOTP-markt; altijd 6-cijferig SHA1 tenzij het datasheet anders vermeldt. |
Zie ook
- /hotp-qr-code/, de HOTP-generator met live teller + Base32-validatie.
- /standards/totp/, de tijdgebaseerde tegenhanger (RFC 6238).
- /totp-2fa-qr-code/, de TOTP-generator.
- /standards/, terug naar de standaardenindex.