HOTP
HOTP (HMAC-based One-Time Password, RFC 4226) to oparty na liczniku odpowiednik TOTP. Tam gdzie TOTP postępuje według zegara, HOTP postępuje według wspólnego licznika, który zarówno token jak i serwer inkrementują przy każdym użytym kodzie.
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.
Co to jest
QR rejestracji HOTP to URL w schemacie otpauth:// z hotp jako typem. Zawiera wspólny tajny klucz HMAC oraz wartość licznika, którą obie strony muszą utrzymywać zsynchronizowaną. Format:
otpauth://hotp/LABEL?secret=SECRET&issuer=ISSUER&counter=N&digits=N&algorithm=ALG- LABEL,
Issuer:Account, URL-zakodowany. Przykład:YubiKey:alice@example.com. - secret, wspólny klucz HMAC, zakodowany Base32 (RFC 4648 §6: A-Z, 2-7).
- counter, wartość startowa licznika. Zwykle
0, ale można wznowić od znanej wartości przy ponownej rejestracji tokenu. - issuer, nazwa usługi wyświetlana w aplikacji autentykator.
- digits,
6(domyślny) lub8. RFC 4226 §5.3 określa 6; 8 jest powszechnym rozszerzeniem. - algorithm,
SHA1w praktyce. RFC 4226 definiuje tylko SHA1; warianty SHA256/512 są rozszerzeniami RFC 6238.
HOTP vs TOTP, kiedy używać którego
| Właściwość | HOTP (RFC 4226) | TOTP (RFC 6238) |
|---|---|---|
| Postępuje na | Liczniku (każde udane użycie) | Zegarze (co 30 s) |
| Wymaga synchronizacji zegara | Nie | Tak, w zakresie ~30 s dryfu |
| Resync przy dryfie | Serwer akceptuje kolejne N wartości licznika | Serwer akceptuje okno ±1 |
| Typyczne wdrożenie | YubiKey, starsze tokeny sprzętowe, bankowość offline | Każde konsumenckie 2FA, Google, Microsoft, 1Password, Authy |
| Ponowne użycie licznika | Katastrofalne, z czasem ujawnia tajny klucz | N/D |
| Podatność przy wycieku klucza | Wszystkie przyszłe kody przewidywalne | Wszystkie przeszłe + przyszłe kody przewidywalne |
Kanoniczne wektory testowe
RFC 4226 Dodatek D dostarcza referenyjne wartości HOTP dla tajnego klucza 12345678901234567890 (20 bajtów, Base32 GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ) z 6-cyfrowym wyjściem:
| Counter | HOTP (6-digit) |
|---|---|
0 | 755224 |
1 | 287082 |
2 | 359152 |
3 | 969429 |
4 | 338314 |
5 | 254676 |
6 | 287922 |
7 | 162583 |
8 | 399871 |
9 | 520489 |
Minimalny payload QR do rejestracji przy liczniku 0:
otpauth://hotp/Example:test?secret=GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ&issuer=Example&counter=0Walidator tajnego klucza Base32 na żywo
Ten sam walidator co na stronie TOTP, tajne klucze HOTP używają identycznego alfabetu Base32 (RFC 4648 §6: A-Z, 2-7). Działa w przeglądarce, bez komunikacji z serwerem.
Typowe pułapki
- Dryf licznika. Jeśli użytkownik naciśnie przycisk tokenu, ale serwer nie zarejestruje kodu, licznik tokenu wyprzedza licznik serwera. Serwery obsługują to za pomocą 'okna resync'.
- Ponowne użycie licznika jest katastrofalne. Nigdy nie akceptuj tej samej wartości licznika dwa razy. RFC 4226 §7.3 wymaga, aby serwer odrzucał kody na poziomie lub poniżej ostatnio zaakceptowanego licznika.
- Eksport licznika podczas kopii zapasowej. Aplikacje autentykatorowe eksportujące wpisy HOTP czasami eksportują klucz, ale nie bieżący licznik. Import do nowego urządzenia resetuje licznik do 0.
- Base32, nie Base64. Ta sama zasada co TOTP: klucze z
0,1,8,9, małymi literami,+lub/to Base64 i będą odrzucane przez każdy autentykator zgodny z RFC. - Tylko SHA1 w praktyce. RFC 4226 definiuje SHA1 jako funkcję HMAC. SHA256/SHA512 to rozszerzenia TOTP z RFC 6238; większość sprzętowych tokenów HOTP ich nie implementuje.
- Parametr cyfr często ignorowany. Wiele tokenów sprzętowych jest ustawionych na 6 cyfr i po cichu obcina przy żądaniu 8. Sprawdź z docelowym sprzętem przed drukowaniem kart QR.
- Nie mieszaj HOTP i TOTP w tym samym QR. Schemat URI używa segmentu
TYPE(hotpvstotp) do przełączania trybów. Jeden klucz może napędzać oba, ale oba przepływy dzielą klucz.
Kompatybilność autentykatorów
| Aplikacja / Token | HOTP | SHA256/512 | 8 cyfr | Uwagi |
|---|---|---|---|---|
| YubiKey Authenticator (iOS/Android/desktop) | Yes | Yes | Yes | HOTP jest kanonicznym trybem YubiKey OATH. Pełna obsługa RFC 4226. |
| Google Authenticator | Yes | Ignorowane (tylko SHA1) | Ignorowane (tylko 6) | De facto baza. Bezpieczne dla HOTP ale tylko z 6-cyfrowym SHA1. |
| 1Password | Yes | Yes | Yes | Pełna obsługa RFC. Licznik jest przechowywany i eksportowany z wpisem. |
| Bitwarden | Yes | Yes | Yes | Pełna obsługa RFC. |
| Microsoft Authenticator | Yes | Yes | Yes | Pełna obsługa RFC. |
| Authy | No | , | , | Usunął HOTP w ostatnich wersjach. Tylko TOTP. |
| Duo Mobile | No | , | , | Używa własnego przepływu push; tylko TOTP jako awaryjny. |
| OATH hardware tokens (Feitian, Token2, etc.) | Yes | Varies | Varies | Kanoniczny rynek sprzętowego HOTP; zawsze 6-cyfrowy SHA1, chyba że dane techniczne mówią inaczej. |
Zobacz też
- /hotp-qr-code/, generator HOTP z walidacją licznika + Base32 na żywo.
- /standards/totp/, czasowy odpowiednik (RFC 6238).
- /totp-2fa-qr-code/, generator TOTP.
- /standards/, powrót do indeksu standardów.