- Temeljna razlika v vhodni spremenljivki: HOTP računa zgoščene vrednosti iz monotono naraščajočega števca C, medtem ko TOTP nadomesti C s časovnim korakom T (CurrentUnixTime / 30).
- Neposredno dedovanje: TOTP je matematično specializacija HOTP:
TOTP(K, Time) = HOTP(K, T). Oba algoritma uporabljata popolnoma enako funkcijo dinamičnega krajšanja (Dynamic Truncation). - Odločilni arhitekturni dejavnik: HOTP je stanoven (strežniki morajo ob vsaki overitvi zakleniti števec in zapisati spremembo na disk). TOTP je brezstanoven, kar sodobnim mikrovalovnim storitvam v oblaku omogoča potrjevanje žetonov v porazdeljenih gručah brez centraliziranih zapisov v bazo podatkov.
Zgodovinske korenine: Od lastniških strojnih žetonov do odprtih spletnih standardov
V zgodnjih 2000-ih so pri korporativnem dvofaktorskem preverjanju pristnosti prevladovali lastniški strojni obeski za ključe, kot je bil RSA SecurID. Te zaprte in drage naprave so vsebovale notranje kremenčeve kristale, sinhronizirane z lastniškimi strežniki podjetja. Če je organizacija želela zagotoviti večfaktorsko varnost tisočem zaposlenih, so bili stroški nabave strojne opreme in lastniških licenc astronomski.
Da bi avtentikacijo osvobodili odvisnosti od posameznih ponudnikov, so vodilna tehnološka podjetja ustanovila konzorcij OATH (Initiative for Open Authentication) z namenom oblikovanja odprtih, brezplačnih standardov IETF, ki bi jih lahko vsak programski inženir prosto pregledoval, implementiral in varnostno revidiral:
HMAC-Based One-Time Password Algorithm. Prilagojen za energijsko varčne mikrokrmilnike s fizičnim gumbom. Pritisk na gumb poveča notranji števec in na zaslonu LCD izpiše 6-mestni žeton.
Time-Based One-Time Password Algorithm. Zasnovan ob množičnem razmahu pametnih telefonov. Z izkoriščanjem omrežne časovne sinhronizacije NTP prek mobilnih omrežij je TOTP popolnoma odpravil težave z neskladjem stanj fizičnih gumbov.
Arhitektura HOTP (RFC 4226) in mehanika dinamičnega krajšanja na ravni bajtov
Temeljna matematična opredelitev algoritma HOTP je presenetljivo jedrnata in elegantna:
Pregled parametrov:
K: Deljeni simetrični tajni ključ (običajno dekodirano 160-bitno / 20-bajtno binarno zaporedje iz zapisa Base32).C: 8-bajtno (64-bitno) celo število v vrstnem redu bajtov big-endian, ki predstavlja števec.HMAC-SHA-1: Koda za preverjanje pristnosti sporočil s ključem, ki ustvari 20-bajtni (160-bitni) kriptografski izvleček (digest).
🔍 Kako dinamično krajšanje (DT) pretvori 20 bajtov v 6 števk:
Izvleček HMAC-SHA1 vsebuje 160 bitov (20 bajtov). Pridobivanje 6 enakomernih decimalnih števk zahteva determinističen mehanizem, odporen proti kolizijam, opisan v razdelku 5.3 standarda RFC 4226:
Predpostavimo tajni ključ v ASCII "12345678901234567890" in števec C = 0. Nastali izvleček HMAC-SHA1 v šestnajstiški obliki je:
1. Zadnji bajt je 0x71. 0x71 & 0x0F = 0x01, zato je Offset = 1.
2. Bajti od 1 do 4 so: 93 cf 18 50. Z ničlenjem bita MSB dobimo 0x13cf1850, kar v desetiškem sistemu znaša 332.339.280.
3. 332339280 mod 1000000 = 339280. Končna 6-mestna koda OTP je 339280!
Razvoj TOTP (RFC 6238): Čarobnost časovnega koraka
Pri HOTP je bilo treba števec na odjemalcu stalno usklajevati s strežnikom. Pri programskih aplikacijah ročno beleženje ali pritiskanje gumbov prinaša nenehne človeške napake.
Standard RFC 6238 je števec C nadomestil z diskretnim časovnim korakom T, izpeljanim neposredno iz unixovega časa (Unix Epoch):
- CurrentUnixTime: Število sekund, pretečenih od 1. januarja 1970 00:00:00 UTC.
- T0: Začetna referenčna točka epohe (v vseh sodobnih sistemih nastavljena na 0).
- X (Dolžina časovnega okna): Standardno priporočeno trajanje 30 sekund.
- Funkcija zaokroževanja navzdol ⌊ ⌋: Za kateri koli časovni žig v 30-sekundnem oknu ostane vrednost T enaka. Na primer med sekundama 1728211200 in 1728211229 se T ovrednoti v popolnoma isto 64-bitno celo število.
Binarna serializacija: Ko je T izračunan, se shrani v 8-bajtni binarni medpomnilnik v formatu big-endian (z enako strukturo v pomnilniku kot števec C pri HOTP). Posledično se enotna formula poenostavi v:
TOTP(K, Time) = HOTP(K, T)
Ta matematična eleganca pojasnjuje, zakaj aplikacije za avtentikacijo sinhrono osvežujejo kode vsakih 30 sekund brez potrebe po trajnem shranjevanju stanj.
HS[31] & 0x0F); pri SHA-512 (64-bajtni izvleček) se odmik določi iz bajta 63 (HS[63] & 0x0F). Kljub temu v 99,9 % komercialnih spletnih storitev (Google, Microsoft, GitHub, AWS) ostaja privzet SHA-1 zaradi široke združljivosti z mobilnimi odjemalci.
Celovita vzporedna primerjalna matrika (HOTP vs. TOTP)
| Vidik | HOTP (RFC 4226) | TOTP (RFC 6238) |
|---|---|---|
| Vhodna spremenljivka | Števec dogodkov C (monotono naraščajoč) | Časovni korak T (30-sekundno okno epohe Unix) |
| Življenjska doba žetona | Neomejena (veljaven do naslednje uspešne prijave) | Strogo 30 sekund (samodejno poteče) |
| Arhitektura strežnika | Stanovna (zahteva atomske vpise v bazo ob vsaki prijavi) | Brezstanovna (neodvisno preverjanje časa prek NTP) |
| Izpostavljenost napadom s ponavljanjem (Replay) | Zmerna (prestreženi žeton velja do uporabe) | Minimalna (omejena na preostale sekunde v oknu) |
| Glavni vzrok odpovedi | Desinhronizacija števca (nenamerni pritiski na gumb) | Časovno odstopanje (napačno nastavljen čas na telefonu) |
| Podprte kriptografske zgoščevalne funkcije | Izključno HMAC-SHA-1 | HMAC-SHA-1, HMAC-SHA-256, HMAC-SHA-512 |
| Uveljavljenost v panogi | Starejši bančni kalkulatorji, namenski fizični vstopi | 99,9 % sodobnih spletnih avtentikatorjev |
Inženirske rešitve: Desinhronizacija v primerjavi s časovnim zamikom
V porazdeljenih produkcijskih okoljih med odjemalci in strežniki neizogibno prihaja do odstopanj. Kriptografi so zasnovali specifična kompenzacijska okna za zagotavljanje zanesljivosti:
Če uporabnik pritisne gumb žetona 5-krat, ne da bi kodo poslal, števec odjemalca doseže C+5, medtem ko strežnik ostane pri C.
Standard RFC 4226 določa, da strežnik ob prijavi preveri okno v obsegu [C+1, C+s] (običajno s=20). Ob ujemanju strežnik samodejno premakne števec naprej in vzpostavi sinhronizacijo.
Zaradi zakasnitve omrežja ali rahlega časovnega odstopanja ure v telefonu (npr. telefon zaostaja za 10 sekund) lahko žetoni prispejo v sosednjih časovnih intervalih.
Produkcijski strežniki običajno preverjajo polje 3 zaporednih oken: [T-1, T, T+1], kar podaljša sprejemno okno na 90 sekund.
Ko strežniki preverjajo ujemanje vnesene in izračunane kode, se klasična primerjava nizov (kot je userOtp === serverOtp) prekine ob prvem neujemajočem se znaku. Napadalec, ki meri mikroskopske razlike v omrežnem odzivnem času, lahko postopoma ugane števke. Varni zaledni sistemi zato uporabljajo primerjave v konstantnem času (npr. crypto.timingSafeEqual v okolju Node.js), s čimer preprečijo napade prek stranskih kanalov.
Zakaj je TOTP prevladal na sodobnem spletu
Končna zmaga protokola TOTP nad HOTP na sodobnem internetu je posledica treh temeljnih arhitekturnih prednosti:
V porazdeljenih mikrostoritvah v oblaku lahko katera koli strežniška instanca s časovno sinhronizacijo prek NTP preveri žeton TOTP brez poizvedovanja ali zaklepanja centralne podatkovne baze.
Pametni telefoni neprekinjeno umerjajo svoj sistemski čas prek baznih postaj in GPS, kar odpravlja težave s časovnim zamikom brez potrebe po vzdrževanju strojne opreme.
Žetoni HOTP ostanejo veljavni neomejeno dolgo, dokler niso porabljeni. Žetoni TOTP potečejo v 30 sekundah, s čimer samodejno nevtralizirajo tveganja razkritih dnevnikov ali prestreženih paketov.
Izkusite izračune TOTP v realnem času v orodju 2FA-Tool
Oglejte si, kako se vaš neobdelani niz Base32 s pomočjo dinamičnega krajšanja HMAC-SHA1 pretvori v dinamične 6-mestne kode. 100 % brez povezave v vašem brskalniku.
📚 Sorodni varnostni vodniki
Varen prenos računov 2FA med pametnimi telefoni z uporabo kod QR brez povezave in sinhronizacije v oblaku.
Pravila o skladnosti, shranjevanje kod za obnovitev, prepletanje s ključi SSH in postopki reševanja.
Kako obnoviti dostop do računov Google, Microsoft, Steam, Binance, Apple in Discord.