⏱️ Kryptografia a protokoly RFC ✓ Analýza noriem IETF

Vysvetlenie TOTP vs HOTP: Hlavné rozdiely, bezpečnosť a princípy fungovania

Milióny vývojárov a bezpečnostných inžinierov sa každý deň pozerajú na rotujúce 6-ciferné overovacie kódy, no málokto rozumie elegantnému matematickému mechanizmu pracujúcemu pod povrchom. Od počítadiel riadených udalosťami podľa RFC 4226 (HOTP) z roku 2005 až po diskrétne časové kroky podľa RFC 6238 (TOTP) z roku 2011 tento sprievodca do hĺbky rozoberá algoritmus dynamického orezania (Dynamic Truncation) na úrovni bajtov, zraniteľnosti desynchronizácie počítadla, tolerancie voči posunu hodín a dôvody, prečo TOTP ovládol moderný web.

2FA
Bezpečnostný tím 2FA-Tool
Aktualizované v októbri 2026
Odhadovaný čas čítania: 14 min (2 600+ slov)
RFC 6238 RFC 4226 Dynamic Truncation
💡 Kryptografické zistenia (TL;DR)
  • Základný rozdiel vo vstupnej premennej: HOTP počíta hashe z monotónne rastúceho počítadla C, zatiaľ čo TOTP nahrádza C časovým krokom T (CurrentUnixTime / 30).
  • Priama dedičnosť: TOTP je matematicky špecializáciou HOTP: TOTP(K, Time) = HOTP(K, T). Oba algoritmy používajú presne tú istú funkciu dynamického orezania (Dynamic Truncation).
  • Rozhodujúci architektonický faktor: HOTP je stavový (servery musia pri každom overení zamknúť počítadlo a zapísať zmenu na disk). TOTP je bezstavový, čo umožňuje moderným cloudovým mikroslužbám overovať tokeny v distribuovaných klastroch bez centralizovaných zápisov do databázy.
01

Historické korene: Od proprietárnych hardvérových tokenov k otvoreným webovým štandardom

Začiatkom 21. storočia dominovali podnikovému dvojfaktorovému overovaniu proprietárne hardvérové kľúčenky, ako napríklad RSA SecurID. Tieto uzavreté, nákladné zariadenia obsahovali vnútorné kremíkové kryštály synchronizované s podnikovými servermi. Ak organizácia plánovala poskytnúť viacfaktorové zabezpečenie tisícom zamestnancov, náklady na nákup hardvéru a proprietárne licencie boli astronomické.

Aby bolo overovanie oslobodené od proprietárnych dodávateľov, poprední lídri v odvetví vytvorili konzorcium OATH (Initiative for Open Authentication) s cieľom vytvoriť otvorené, bezplatné štandardy IETF, ktoré by mohol akýkoľvek softvérový vývojár voľne skúmať, implementovať a podrobiť bezpečnostnému auditu:

📜 2005: RFC 4226 (HOTP)

HMAC-Based One-Time Password Algorithm. Navrhnutý pre mikrokontroléry s nízkou spotrebou a fyzickým tlačidlom. Stlačením tlačidla sa zvýši hodnota vnútorného počítadla a na LCD displeji sa zobrazí 6-ciferný token.

📜 2011: RFC 6238 (TOTP)

Time-Based One-Time Password Algorithm. Vznikol s masívnym nástupom smartfónov. Využitím časovej synchronizácie mobilnej siete cez NTP úplne odstránil problémy s nesúladom stavu fyzických tlačidiel.

02

Architektúra HOTP (RFC 4226) a mechanika dynamického orezania bajtov

Základná matematická definícia HOTP je prekvapivo stručná a elegantná:

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

Prehľad parametrov:

  • K: Zdieľaný symetrický tajný kľúč (zvyčajne dekódovaný 160-bitový / 20-bajtový binárny reťazec z formátu Base32).
  • C: 8-bajtové (64-bitové) celé číslo v poradí bajtov big-endian predstavujúce počítadlo.
  • HMAC-SHA-1: Hashovací kód overenia správy s kľúčom generujúci 20-bajtový (160-bitový) kryptografický výťah (digest).

🔍 Ako Dynamic Truncation (DT) prevádza 20 bajtov na 6 číslic:

Výstup HMAC-SHA1 obsahuje 160 bitov (20 bajtov). Extrakcia 6 rovnomerných desiatkových číslic vyžaduje deterministický mechanizmus odolný voči kolíziám, ktorý definuje sekcia 5.3 normy RFC 4226:

// Krok 1: Výpočet dynamického posunu (Offset)
Offset = HS[19] & 0x0F
Vezmite posledný bajt (index 19) z 20-bajtového výťahu. Maska 0x0F izoluje spodné 4 bity, čím vznikne celé číslo striktne medzi 0 a 15 (0x0 až 0xF). To zaručuje, že následná extrakcia 4 bajtov nikdy nepretečie mimo 20-bajtového poľa (keďže 15 + 4 = 19).
// Krok 2: Extrakcia 4 po sebe idúcich bajtov s maskovaním
P = ( (HS[Offset] & 0x7F) << 24 ) | ( (HS[Offset+1] & 0xFF) << 16 ) | ( (HS[Offset+2] & 0xFF) << 8 ) | ( HS[Offset+3] & 0xFF )
Extrahujte 4 bajty počínajúc pozíciou Offset. Maska 0x7F vynuluje najvyšší bit (MSB), aby sa zabránilo pretečeniu znamienkového celého čísla na rôznych architektúrach procesorov (výsledkom je kladné 31-bitové celé číslo).
// Krok 3: Modulo aritmetika pre výsledné číslice
OTP = P mod 106 = P mod 1000000
Použitie modulo 1 000 000 izoluje posledných 6 desiatkových číslic a podľa potreby doplní počiatočné nuly (napr. 748 sa stane „000748“).
🧪 Konkrétny testovací vektor z prílohy D normy RFC 4226:

Predpokladajme tajný kľúč v ASCII "12345678901234567890" a počítadlo C = 0. Výsledný výťah HMAC-SHA1 v hexadecimálnej podobe 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. 0x71 & 0x0F = 0x01, takže Offset = 1.
2. Bajty 1 až 4 sú: 93 cf 18 50. Vynulovanie najvyššieho bitu dáva 0x13cf1850, čo v desiatkovej sústave predstavuje 332 339 280.
3. 332339280 mod 1000000 = 339280. Výsledné 6-ciferné OTP je 339280!

03

Evolúcia TOTP (RFC 6238): Kúzlo časového kroku

HOTP vyžadoval udržiavanie počítadla klienta v presnom súlade so serverom. V softvérových aplikáciách vedie ručné zaznamenávanie alebo klikanie k neustálym ľudským chybám.

Norma RFC 6238 nahradila počítadlo C diskrétnym časovým krokom T odvodeným priamo z unixových hodín (Unix Epoch):

T = ⌊ (CurrentUnixTime - T0) / X ⌋
  • CurrentUnixTime: Počet sekúnd, ktoré uplynuli od 1. januára 1970 00:00:00 UTC.
  • T0: Referenčný počiatočný čas epochy (vo všetkých moderných systémoch nastavený na 0).
  • X (Veľkosť časového okna): Štandardná odporúčaná dĺžka 30 sekúnd.
  • Funkcia zaokrúhlenia nadol ⌊ ⌋: Pre akýkoľvek časový údaj v rámci daného 30-sekundového okna zostáva hodnota T nemenná. Napríklad medzi sekundami 1728211200 a 1728211229 sa T vyhodnotí na úplne rovnaké 64-bitové celé číslo.

Binárna serializácia: Po výpočte T sa hodnota zabalí do 8-bajtového binárneho vyrovnávacieho pamäťového bloku big-endian (s rovnakou štruktúrou v pamäti ako počítadlo C v HOTP). Výsledný univerzálny vzorec sa preto zjednodušuje na:
TOTP(K, Time) = HOTP(K, T) Táto matematická elegancia vysvetľuje, prečo autentifikačné aplikácie synchrónne obnovujú kódy každých 30 sekúnd bez potreby nepretržitej synchronizácie stavu.

Podpora SHA-256 a SHA-512 v RFC 6238: Zatiaľ čo RFC 4226 definoval výlučne HMAC-SHA-1, RFC 6238 rozšíril podporu o HMAC-SHA-256 a HMAC-SHA-512. Pri SHA-256 (32-bajtový výťah) sa posun určuje z bajtu 31 (HS[31] & 0x0F); pri SHA-512 (64-bajtový výťah) sa posun určuje z bajtu 63 (HS[63] & 0x0F). V 99,9 % komerčných služieb (Google, Microsoft, GitHub, AWS) však SHA-1 zostáva predvoleným štandardom z dôvodu širokej spätnej kompatibility mobilných klientov.
04

Podrobné porovnanie: Porovnávacia matica (HOTP vs. TOTP)

Rozmer HOTP (RFC 4226) TOTP (RFC 6238)
Vstupná premenná Počítadlo udalostí C (monotónne rastúce) Časový krok T (30-sekundové okno Unixovej epochy)
Životnosť tokenu Neobmedzená (platný do použitia pri ďalšom prihlásení) Prísnych 30 sekúnd (automaticky zneplatnený)
Architektúra servera Stavová (vyžaduje atomické zápisy do databázy pri každom prihlásení) Bezstavová (nezávislé overenie času cez NTP)
Náchylnosť na útok opakovaním (Replay) Stredná (zachytený token zostáva platný až do použitia) Minimálna (obmedzená na zostávajúce sekundy v aktuálnom okne)
Primárny spôsob zlyhania Desynchronizácia počítadla (neúmyselné stlačenia tlačidla) Posun času (nesprávny systémový čas na telefóne klienta)
Podporované kryptografické hashe Výhradne HMAC-SHA-1 HMAC-SHA-1, HMAC-SHA-256, HMAC-SHA-512
Rozšírenie v praxi Staršie bankové kalkulačky, špecializované fyzické prístupy 99,9 % moderných webových autentifikátorov
05

Riešenia inžinierstva: Desynchronizácia vs. posun času

V distribuovaných produkčných prostrediach dochádza medzi klientmi a servermi k nevyhnutným odchýlkam. Kryptografi navrhli špecifické kompenzačné okná na zachovanie vysokej spoľahlivosti:

⚙️ Riešenie HOTP: Vyhľadávacie overovacie okno dopredu (Look-Ahead Window s)

Ak používateľ stlačí tlačidlo tokenu 5-krát bez odoslania kódu, počítadlo klienta dosiahne C+5, zatiaľ čo server zostáva na hodnote C.
Norma RFC 4226 určuje, že pri overovaní server vypočíta overovacie okno v rozsahu [C+1, C+s] (zvyčajne s=20). Ak nájde zhodu, server posunie počítadlo dopredu a okamžite sa zosynchronizuje.

⏱️ Riešenie TOTP: Tolerancia voči posunu času (okno ±1)

Z dôvodu latencie siete alebo mierneho posunu hodín v telefóne používateľa (napríklad o 10 sekúnd pozadu) môžu kódy prísť v susedných časových intervaloch.
Produkčné servery štandardne overujú pole 3 po sebe idúcich okien: [T-1, T, T+1], čo rozširuje celkové okno akceptácie na 90 sekúnd.

Povinné pravidlo proti útokom opakovaním (Anti-Replay): Aby sa zabránilo opätovnému použitiu rovnakého tokenu v rámci 90-sekundového tolerančného okna, server musí ukladať použité tokeny do rýchlej vyrovnávacej pamäte (napr. Redis) na 90 sekúnd a odmietnuť akékoľvek duplicitné odoslanie.
🛡️ Porovnávanie reťazcov v konštantnom čase (Obrana pred útokmi meraním času):

Keď servery overujú, či sa zadaný kód zhoduje s vypočítaným kódom, bežné porovnávanie reťazcov (ako napríklad userOtp === serverOtp) sa ukončí hneď pri prvom nezhodnom znaku. Útočník merajúci mikroskopické rozdiely v sieťovej odozve dokáže postupne zrekonštruovať jednotlivé číslice. Bezpečné podnikové backendy preto vynucujú porovnanie v konštantnom čase (napr. crypto.timingSafeEqual v Node.js) na úplné potlačenie útokov postranným kanálom.

06

Prečo TOTP vyhral v modernom internete

Jednoznačné víťazstvo protokolu TOTP nad HOTP na modernom webe bolo spôsobené tromi zásadnými architektonickými výhodami:

☁️ Bezstavová škálovateľnosť v cloude

V distribuovaných cloudových mikroslužbách dokáže akákoľvek inštancia servera s časom synchronizovaným cez NTP okamžite overiť TOTP token bez nutnosti dopytovania alebo zamykania centralizovanej databázy.

📱 Synergia mobilného ekosystému

Smartfóny neustále kalibrujú svoj systémový čas prostredníctvom mobilných vysielačov a GPS, čo úplne odstraňuje problém s posunom hodín bez nutnosti údržby hardvéru.

🛡️ Úzke 30-sekundové útočné okno

Tokeny HOTP zostávajú platné neobmedzene, až kým nie sú použité. Tokeny TOTP expirujú po 30 sekundách, čím automaticky neutralizujú riziká uniknutých logov či zachytených paketov.

🧮 Čistý engine RFC 6238 na strane klienta

Vyskúšajte výpočty TOTP v reálnom čase v nástroji 2FA-Tool

Sledujte, ako sa váš reťazec Base32 premieňa na dynamické 6-ciferné kódy prostredníctvom dynamického orezania HMAC-SHA1. 100 % offline vo vašom prehliadači.

Otvoriť online generátor