- Fundamentalna różnica danych wejściowych: HOTP oblicza skróty na podstawie monotonicznie rosnącego licznika C, podczas gdy TOTP zastępuje C krokiem czasowym epoki T (BieżącyCzasUnix / 30).
- Bezpośrednie dziedziczenie: Pod względem matematycznym TOTP jest bezpośrednią specjalizacją HOTP:
TOTP(K, Czas) = HOTP(K, T). Oba algorytmy wykorzystują dokładnie tę samą funkcję dynamicznego obcinania (Dynamic Truncation). - Decydujący czynnik architektoniczny: HOTP jest stanowe (serwery muszą blokować rekord i zapisywać stan licznika na dysku przy każdej walidacji). TOTP jest bezstanowe, co umożliwia nowoczesnym chmurowym mikrousługom walidację tokenów w rozproszonych klastrach za load balancerami bez konieczności centralnego zapisu w bazie danych.
Źródła historyczne: Od własnościowych tokenów sprzętowych do otwartych standardów internetowych
Na początku lat 2000. korporacyjne uwierzytelnianie dwuskładnikowe było zdominowane przez własnościowe breloki sprzętowe, takie jak RSA SecurID. Te zamknięte, kosztowne urządzenia zawierały wewnętrzne rezonatory kwarcowe zsynchronizowane z własnościowymi serwerami przedsiębiorstwa. Jeśli organizacja chciała zapewnić wieloskładnikowe bezpieczeństwo tysiącom pracowników, koszty zakupu sprzętu i opłat licencyjnych były astronomiczne.
Aby uniezależnić uwierzytelnianie od monopolistycznych dostawców, liderzy branży powołali konsorcjum OATH (Initiative for Open Authentication), którego celem było opracowanie otwartych, bezpłatnych standardów IETF, możliwych do wdrożenia, inspekcji i audytu przez każdego inżyniera oprogramowania:
HMAC-Based One-Time Password Algorithm. Zaprojektowany z myślą o energooszczędnych mikrokontrolerach z fizycznym przyciskiem. Naciśnięcie przycisku inkrementuje wewnętrzny licznik i wyświetla 6-cyfrowy token na małym ekranie LCD.
Time-Based One-Time Password Algorithm. Powstał wraz z eksplozją popularności smartfonów. Wykorzystując synchronizację czasu sieciowego NTP w sieciach komórkowych, TOTP całkowicie wyeliminowało problem rozbieżności stanów fizycznych przycisków.
Architektura HOTP (RFC 4226) i bajtowa mechanika dynamicznego obcinania
Podstawowa definicja matematyczna algorytmu HOTP jest zwodniczo prosta:
Szczegółowy opis parametrów:
K: Współdzielony symetryczny klucz tajny (zazwyczaj zdekodowany z Base32 160-bitowy / 20-bajtowy ciąg binarny).C: 8-bajtowy (64-bitowy) licznik całkowity w formacie big-endian.HMAC-SHA-1: Kod uwierzytelniania wiadomości z kluczem, generujący 20-bajtowy (160-bitowy) skrót kryptograficzny.
🔍 Jak Dynamic Truncation (DT) przekształca 20 bajtów w 6 cyfr:
Skrót HMAC-SHA1 składa się ze 160 bitów (20 bajtów). Wyodrębnienie 6 jednolitych cyfr dziesiętnych wymaga deterministycznego, odpornego na kolizje mechanizmu selekcji, zdefiniowanego w sekcji 5.3 normy RFC 4226:
Załóżmy, że kluczem tajnym jest ciąg ASCII "12345678901234567890", a licznik C = 0. Otrzymany skrót HMAC-SHA1 w zapisie szesnastkowym to:
1. Ostatnim bajtem jest 0x71. 0x71 & 0x0F = 0x01, zatem Offset = 1.
2. Bajty od 1 do 4 to: 93 cf 18 50. Wyzerowanie najstarszego bitu daje 0x13cf1850, co w zapisie dziesiętnym równa się 332 339 280.
3. 332339280 mod 1000000 = 339280. Otrzymany 6-cyfrowy kod OTP to 339280!
Ewolucja TOTP (RFC 6238): Magia kroku czasowego
HOTP wymagało utrzymywania ścisłej synchronizacji stanu licznika pomiędzy klientem a serwerem. Na urządzeniach programowych zliczanie kliknięć lub naciśnięć klawisza generowało nieustanne pomyłki użytkowników.
Norma RFC 6238 zastąpiła licznik C dyskretnym krokiem czasowym T wyliczanym bezpośrednio z zegara epoki Unix:
- CurrentUnixTime: Liczba sekund, które upłynęły od 1970-01-01 00:00:00 UTC.
- T0: Punkt odniesienia inicjalizacji epoki (domyślnie 0 we wszystkich współczesnych implementacjach).
- X (Okno kroku czasowego): Standardowa zalecana długość wynosząca 30 sekund.
- Funkcja podłogi ⌊ ⌋: Dla każdego znacznika czasu wewnątrz 30-sekundowego okna wartość T pozostaje niezmienna. Na przykład między sekundami epoki 1728211200 a 1728211229 wartość T daje dokładnie tę samą 64-bitową liczbę całkowitą.
Serializacja binarna: Po obliczeniu wartości T jest ona pakowana do 8-bajtowego bufora binarnego w formacie big-endian (o identycznej strukturze w pamięci jak licznik C w HOTP). W rezultacie ujednolicony wzór upraszcza się do postaci:
TOTP(K, Czas) = HOTP(K, T)
Ta matematyczna elegancja wyjaśnia, dlaczego aplikacje uwierzytelniające rotują tokeny synchronicznie co 30 sekund bez konieczności ciągłej synchronizacji stanu sieciowego.
HS[31] & 0x0F); w SHA-512 (skrót 64-bajtowy) z bajtu 63 (HS[63] & 0x0F). Jednak w 99,9% serwisów komercyjnych (Google, Microsoft, GitHub, AWS) domyślnym standardem pozostaje SHA-1 ze względu na kompatybilność ze starszymi klientami mobilnymi.
Szczegółowa macierz porównawcza (HOTP vs TOTP)
| Wymiar | HOTP (RFC 4226) | TOTP (RFC 6238) |
|---|---|---|
| Zmienna wejściowa | Licznik zdarzeń C (monotonicznie rosnący) | Krok czasowy T (30-sekundowe okno epoki Unix) |
| Czas życia tokenu | Nieokreślony (ważny do zużycia przy kolejnym logowaniu) | Ściśle 30 sekund (automatycznie unieważniany) |
| Architektura serwera | Stanowa (wymaga atomowych zapisów w bazie danych) | Bezstanowa (niezależna weryfikacja z użyciem NTP) |
| Podatność na powtórzenia (Replay) | Umiarkowana (przechwycony token jest ważny do momentu użycia) | Minimalna (ograniczona do sekund pozostałych w oknie) |
| Główny powód awarii | Desynchronizacja licznika (przypadkowe naciśnięcia przycisku) | Dryf zegara (rozbieżność czasu w urządzeniu użytkownika) |
| Obsługiwane funkcje skrótu | Wyłącznie HMAC-SHA-1 | HMAC-SHA-1, HMAC-SHA-256, HMAC-SHA-512 |
| Adopcja w branży | Starsze tokeny bankowe, wyspecjalizowane bramki dostępu | 99,9% nowoczesnych internetowych aplikacji 2FA |
Desynchronizacja a dryf czasu: Rozwiązania inżynieryjne
W rozproszonych środowiskach produkcyjnych zegary i liczniki nieuchronnie podlegają rozbieżnościom. Twórcy kryptografii przewidzieli specjalne mechanizmy kompensacyjne:
Jeśli użytkownik kliknie przycisk na tokenie 5 razy bez wysłania formularza, licznik w urządzeniu osiągnie stan C+5, podczas gdy serwer pozostaje przy wartości C.
RFC 4226 nakazuje, aby serwer podczas uwierzytelniania obliczał wartości w oknie rozbieżności [C+1, C+s] (zazwyczaj s=20). Po znalezieniu dopasowania serwer natychmiast synchronizuje licznik do nowej wartości.
Ze względu na opóźnienia sieciowe lub minimalny dryf zegara w telefonie klienta (np. opóźnienie o 10 sekund), tokeny mogą dotrzeć w sąsiednich krokach czasowych.
Serwery produkcyjne sprawdzają tablicę 3 okien: [T-1, T, T+1], co skutecznie wydłuża akceptowalne okno weryfikacji do 90 sekund.
Gdy serwer weryfikuje zgodność kodu użytkownika z wyliczonym kodem, naiwne operacje porównywania ciągów (jak userOtp === serverOtp) kończą działanie przy pierwszym niezgodnym znaku. Napastnik mierzący mikroskopijne różnice w czasie odpowiedzi sieciowej może znak po znaku odgadnąć cały kod. Systemy korporacyjne wymuszają porównywanie w stałym czasie (np. crypto.timingSafeEqual w Node.js), eliminując ataki typu side-channel timing analysis.
Dlaczego TOTP zdominowało współczesny internet
Ostateczne zwycięstwo TOTP nad HOTP w internecie wynikało z trzech kluczowych filarów architektonicznych:
W rozproszonych mikrousługach obejmujących wiele regionów dowolna instancja serwera ze zsynchronizowanym czasem NTP może zweryfikować token TOTP bez blokowania centralnej bazy danych.
Smartfony nieustannie kalibrują zegary systemowe za pośrednictwem stacji bazowych GSM i GPS, całkowicie eliminując problem dryfu czasu bez konieczności serwisowania sprzętu.
Tokeny HOTP pozostają ważne bezterminowo aż do zużycia. Tokeny TOTP wygasają po 30 sekundach, automatycznie neutralizując ryzyko wynikające z wycieków z logów czy podsłuchu pakietów.
Sprawdź obliczenia TOTP w czasie rzeczywistym w 2FA-Tool
Zobacz, jak Twój tajny klucz Base32 przekształca się w dynamiczne 6-cyfrowe kody za pomocą algorytmu HMAC-SHA1 dynamic truncation. W 100% offline w Twojej przeglądarce.
📚 Powiązane przewodniki po bezpieczeństwie
Jak przenosić konta 2FA między smartfonami za pomocą kodów QR offline i synchronizacji w chmurze.
Zasady zgodności, bezpieczne zapisywanie kodów zapasowych, współpraca z kluczami SSH i procedury ratunkowe.
Jak odzyskać dostęp do kont Google, Microsoft, Steam, Binance, Apple i Discord.