⏱️ Kryptografie a protokoly RFC ✓ Analýza standardů IETF

Srovnání TOTP vs HOTP: Hlavní rozdíly, bezpečnost a principy fungování

Miliony vývojářů a bezpečnostních inženýrů se denně dívají na rotující 6místné ověřovací kódy, ale málokdo rozumí elegantnímu matematickému aparátu, který běží pod povrchem displeje. Od událostmi řízených čítačů v RFC 4226 (HOTP) z roku 2005 po diskrétní časové kroky v RFC 6238 (TOTP) z roku 2011 – tento průvodce podrobně zkoumá bajtový algoritmus dynamického zkracování (Dynamic Truncation), zranitelnosti při desynchronizaci čítačů, toleranci časového posunu a důvody, proč TOTP zcela ovládl moderní web.

2FA
Bezpečnostní tým 2FA-Tool
Aktualizováno: říjen 2026
Odhadovaný čas čtení: 12 min (více než 2 600 slov)
RFC 6238 RFC 4226 Dynamic Truncation
💡 Základní kryptografická zjištění (TL;DR)
  • Zásadní rozdíl ve vstupní proměnné: HOTP počítá hashe z monotónně rostoucího čítače C, zatímco TOTP nahrazuje C časovým krokem T odvozeným z epochálního času (CurrentUnixTime / 30).
  • Přímá návaznost: TOTP je z matematického pohledu specializací HOTP: TOTP(K, Time) = HOTP(K, T). Oba algoritmy využívají naprosto stejnou funkci dynamického zkrácení (Dynamic Truncation).
  • Rozhodující architektonický faktor: HOTP je stavový (servery musí při každém ověření zamykat a ukládat stav čítače do databáze). TOTP je bezstavový, což moderním cloudovým mikroslužbám umožňuje ověřovat tokeny napříč distribuovanými load-balancovanými klastry bez nutnosti centralizovaných zápisů.
01

Historické kořeny: Od proprietárních hardwarových tokenů k otevřeným webovým standardům

Na počátku tisíciletí vládly podnikovému dvoufázovému ověřování proprietární klíčenky jako RSA SecurID. Tato uzavřená a nákladná zařízení obsahovala vnitřní křemenné krystaly synchronizované s proprietárními podnikovými servery. Pokud chtěla organizace zajistit vícefaktorovou bezpečnost pro tisíce zaměstnanců, náklady na pořízení hardwaru a proprietární licence byly astronomické.

Aby se autentizace osvobodila od monopolu konkrétních dodavatelů, vzniklo konsorcium OATH (Initiative for Open Authentication), složené z předních technologických lídrů. Jeho cílem bylo vytvořit otevřené a bezplatné standardy IETF, které by mohl každý softwarový inženýr volně zkoumat, implementovat a auditovat:

📜 2005: RFC 4226 (HOTP)

HMAC-Based One-Time Password Algorithm. Navržen pro nízkovýkonové mikrokontroléry s fyzickým tlačítkem. Stisknutí tlačítka zvýší vnitřní čítač a zobrazí 6místný kód na LCD displeji.

📜 2011: RFC 6238 (TOTP)

Time-Based One-Time Password Algorithm. Vznikl v reakci na masivní nástup chytrých telefonů. Využitím síťové synchronizace času přes NTP v mobilních sítích TOTP zcela odstranil problémy s nesouladem stavu tlačítek.

02

Architektura HOTP (RFC 4226) a bajtová mechanika dynamického zkracování

Základní matematická definice HOTP je překvapivě stručná:

HOTP(K, C) = Truncate(HMAC-SHA-1(K, C)) mod 10DigitCount

Rozbor parametrů:

  • K: Sdílený symetrický tajný klíč (obvykle binární sekvence 160 bitů / 20 bajtů dekódovaná z Base32).
  • C: 8bajtový (64bitový) celočíselný čítač ve formátu big-endian.
  • HMAC-SHA-1: Autentizační kód zprávy s klíčem produkující 20bajtový (160bitový) kryptografický otisk.

🔍 Jak dynamické zkrácení (Dynamic Truncation - DT) převádí 20 bajtů na 6 číslic:

Otisk HMAC-SHA1 obsahuje 160 bitů (20 bajtů). Získání 6 rovnoměrně rozložených desítkových číslic vyžaduje deterministický a vůči kolizím odolný mechanismus výběru, popsaný v sekci 5.3 specifikace RFC 4226:

// Krok 1: Výpočet dynamického offsetu (posunu)
Offset = HS[19] & 0x0F
Vezme se poslední bajt (index 19) z 20bajtového otisku. Bitová maska 0x0F izoluje spodní 4 bity, což dává celé číslo přísně v rozsahu 0 až 15 (0x0 až 0xF). Tím je zaručeno, že následná 4bajtová extrakce nikdy nepřeteče 20bajtový buffer (jelikož 15 + 4 = 19).
// Krok 2: Extrakce 4 po sobě jdoucích bajtů s maskováním
P = ( (HS[Offset] & 0x7F) << 24 ) | ( (HS[Offset+1] & 0xFF) << 16 ) | ( (HS[Offset+2] & 0xFF) << 8 ) | ( HS[Offset+3] & 0xFF )
Vyjmou se 4 bajty počínaje indexem Offset. Maska 0x7F vynuluje nejvyšší platný bit (MSB), aby se předešlo potížím se znaménkovým celým číslem napříč různými architekturami procesorů (zajišťuje čistě kladné 31bitové číslo).
// Krok 3: Modulo operace pro finální číslice
OTP = P mod 106 = P mod 1000000
Aplikace operace modulo 1 000 000 izoluje závěrečných 6 desítkových číslic, případně doplněných úvodními nulami (např. hodnota 748 se zformátuje na "000748").
🧪 Konkrétní testovací vektor z RFC 4226 Příloha D:

Předpokládejme, že tajný klíč je ASCII řetězec "12345678901234567890" a čítač má hodnotu C = 0. Výsledný otisk HMAC-SHA1 v hexadecimálním tvaru je:

cc 93 cf 18 50 8d 94 93 4c 64 b6 6d 8b fb 87 fb 23 cb 4b 71

1. Poslední bajt je 0x71. Operace 0x71 & 0x0F = 0x01, tedy Offset = 1.
2. Bajty 1 až 4 jsou: 93 cf 18 50. Vynulování MSB dává 0x13cf1850, což v desítkové soustavě odpovídá číslu 332 339 280.
3. 332339280 mod 1000000 = 339280. Výsledný 6místný OTP kód je tedy 339280!

03

Evoluce TOTP (RFC 6238): Kouzlo časových kroků

HOTP vyžadoval udržovat čítač na klientovi a serveru v neustálém souladu. Na softwarových zařízeních však počítání stisků tlačítek vedlo k častým lidským chybám a desynchronizacím.

Standard RFC 6238 nahradil čítač C diskrétním časovým krokem T odvozeným přímo z unixového času:

T = ⌊ (CurrentUnixTime - T0) / X ⌋
  • CurrentUnixTime: Počet sekund uplynulých od 1970-01-01 00:00:00 UTC.
  • T0: Referenční bod začátku epochy (ve všech moderních nasazeních roven 0).
  • X (Délka časového okna): Standardní doporučená délka činí 30 sekund.
  • Zaokrouhlovací funkce ⌊ ⌋ (floor): Pro jakýkoli časový okamžik v daném 30sekundovém okně zůstává hodnota T invariantní. Například mezi unixovými sekundami 1728211200 a 1728211229 nabývá T naprosto stejného 64bitového celého čísla.

Binární serializace: Jakmile je hodnota T vypočtena, je zabalena do 8bajtového big-endian binárního bufferu (jehož paměťová struktura je zcela identická s čítačem C v HOTP). Jednotný vzorec se proto zjednodušuje na:
TOTP(K, Time) = HOTP(K, T) Tato matematická elegance vysvětluje, proč autentizační aplikace generují nové kódy synchronně každých 30 sekund, aniž by musely s kýmkoli komunikovat nebo udržovat stav.

Podpora SHA-256 a SHA-512 v RFC 6238: Zatímco RFC 4226 striktně předepisoval HMAC-SHA-1, RFC 6238 rozšířil možnosti o HMAC-SHA-256 a HMAC-SHA-512. V případě SHA-256 (32bajtový otisk) se offset získává z 31. bajtu (HS[31] & 0x0F); u SHA-512 (64bajtový otisk) z 63. bajtu (HS[63] & 0x0F). Nicméně u 99,9 % komerčních služeb (Google, Microsoft, GitHub, AWS) zůstává výchozím standardem SHA-1 z důvodu univerzální kompatibility se staršími mobilními klienty.
04

Podrobná srovnávací tabulka (HOTP vs. TOTP)

Kritérium HOTP (RFC 4226) TOTP (RFC 6238)
Vstupní proměnná Čítač událostí C (monotónně rostoucí) Časový krok T (30sekundové okno Unix epoch)
Platnost tokenu Neomezená (platí do jeho použití při přihlášení) Přísně 30 sekund (automaticky expiruje)
Architektura serveru Stavová (vyžaduje atomický zápis do databáze při každém přihlášení) Bezstavová (nezávislé ověření přes čas NTP)
Riziko útoku přehráním (Replay) Střední (odposlechnutý kód zůstává platný do prvního použití) Minimální (omezeno pouze na zbývající sekundy v aktuálním okně)
Hlavní příčina selhání Desynchronizace čítače (náhodné stisky tlačítka) Časový posun hodin (rozdíl v systémovém čase telefonu)
Podporované kryptografické hashe Výhradně HMAC-SHA-1 HMAC-SHA-1, HMAC-SHA-256, HMAC-SHA-512
Rozšíření v oboru Starší bankovní klíčenky, specializované fyzické brány 99,9 % moderních webových autentizátorů
05

Desynchronizace vs. časový posun: Technická řešení

V distribuovaných produkčních prostředích dochází k nevyhnutelným posunům mezi klienty a servery. Kryptografové proto navrhli explicitní kompenzační mechanismy pro zachování spolehlivosti:

⚙️ Řešení pro HOTP: Dopředné ověřovací okno (Look-Ahead Window s)

Pokud uživatel stiskne tlačítko tokenu 5krát, aniž by kód odeslal, hodnota čítače na klientovi vzroste na C+5, zatímco na serveru zůstává C.
RFC 4226 stanoví, že server při ověřování prověřuje dopředné okno v rozsahu [C+1, C+s] (obvykle s hodnotou s=20). Pokud kód odpovídá kterékoli z těchto hodnot, server skočí vpřed a okamžitě sesynchronizuje čítač C na novou úroveň.

⏱️ Řešení pro TOTP: Tolerance časového posunu (Okno ±1 krok)

Kvůli síťové latenci nebo mírně opožděným hodinám telefonu (např. posun o 10 sekund) mohou kódy dorazit v sousedním časovém intervalu.
Produkční servery proto vyhodnocují pole tří oken: [T-1, T, T+1], což efektivně rozšiřuje toleranci přijetí na 90 sekund.

Povinné pravidlo proti opakování (Anti-Replay): Aby se zabránilo zneužití zachycených tokenů během tohoto 90sekundového okna, musí servery použité tokeny ukládat do mezipaměti (např. Redis) po dobu 90 sekund a jakékoli duplicitní odeslání okamžitě odmítnout.
🛡️ Porovnání řetězců v konstantním čase (Obrana proti časovým útokům):

Když server ověřuje, zda se kód zadaný uživatelem shoduje s vypočítaným kódem, běžné porovnání řetězců (jako userOtp === serverOtp) skončí na prvním neshodném znaku. Útočník měřící nepatrné odchylky v síťové odezvě by tak mohl jednotlivé číslice postupně odhadnout. Podnikové backendy proto vynucují porovnání v konstantním čase (např. crypto.timingSafeEqual v Node.js), což postranní časové útoky zcela vylučuje.

06

Proč TOTP ovládl moderní internet

Jednoznačné vítězství TOTP nad HOTP napříč celým webem bylo způsobeno třemi klíčovými architektonickými výhodami:

☁️ Bezstavová cloudová škálovatelnost

V distribuovaných víceregionálních mikroslužbách může kterákoli instance serveru s časem synchronizovaným přes NTP ověřit TOTP tokeny bez dotazování či zamykání záznamů v centrální databázi.

📱 Synergie s mobilními telefony

Chytré telefony neustále kalibrují svůj systémový čas přes vysílače mobilních sítí a GPS, což eliminuje posun hodin bez nutnosti manuální správy hardwaru.

🛡️ Úzké 30sekundové okno pro útok

Kódy HOTP zůstávají platné neomezeně dlouho, dokud nejsou použity. Tokeny TOTP expirují po 30 sekundách, což automaticky znehodnocuje uniklé logy i pasivní odposlechy síťových paketů.

🧮 Čistě klientský engine dle RFC 6238

Vyzkoušejte si výpočty TOTP v reálném čase v nástroji 2FA-Tool

Podívejte se, jak se váš tajný klíč v Base32 převádí na dynamické 6místné kódy pomocí dynamického zkracování HMAC-SHA1. 100% offline přímo ve vašem prohlížeči.

Otevřít generátor