⏱️ Kriptografija in protokoli RFC ✓ Analiza standardov IETF

Razlaga TOTP v primerjavi s HOTP: Ključne razlike, varnost in načela delovanja

Milijoni razvijalcev in varnostnih inženirjev vsak dan opazujejo vrteče se 6-mestne kode za preverjanje, vendar le redki razumejo eleganten matematični mehanizem, ki deluje v ozadju. Od dogodkovno vodenih števcev v RFC 4226 (HOTP) iz leta 2005 do diskretnih časovnih korakov v RFC 6238 (TOTP) iz leta 2011 ta vodnik podrobno obravnava algoritem dinamičnega krajšanja (Dynamic Truncation) na ravni bajtov, ranljivosti desinhronizacije števca, tolerance časovnega odstopanja ur in razloge, zakaj je TOTP postal standard sodobnega spleta.

2FA
Varnostna ekipa 2FA-Tool
Posodobljeno oktobra 2026
Ocenjen čas branja: 14 min (več kot 2.600 besed)
RFC 6238 RFC 4226 Dynamic Truncation
💡 Kriptografske ugotovitve (TL;DR)
  • 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.
01

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:

📜 2005: RFC 4226 (HOTP)

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.

📜 2011: RFC 6238 (TOTP)

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.

02

Arhitektura HOTP (RFC 4226) in mehanika dinamičnega krajšanja na ravni bajtov

Temeljna matematična opredelitev algoritma HOTP je presenetljivo jedrnata in elegantna:

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

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:

// 1. korak: Izračun dinamičnega odmika (Offset)
Offset = HS[19] & 0x0F
Vzemite zadnji bajt (indeks 19) 20-bajtnega izvlečka. Maska 0x0F izolira spodnje 4 bite, kar da celo število strogo med 0 in 15 (0x0 do 0xF). To zagotavlja, da nadaljnje branje 4 bajtov nikoli ne prekorači 20-bajtnega medpomnilnika (saj je 15 + 4 = 19).
// 2. korak: Ekstrakcija 4 zaporednih bajtov z maskiranjem
P = ( (HS[Offset] & 0x7F) << 24 ) | ( (HS[Offset+1] & 0xFF) << 16 ) | ( (HS[Offset+2] & 0xFF) << 8 ) | ( HS[Offset+3] & 0xFF )
Izvlecite 4 bajte z začetkom na mestu Offset. Maska 0x7F postavi najpomembnejši bit (MSB) na nič, da se prepreči prekoračitev predznačenega celega števila na različnih procesorjih (s tem dobimo čisto pozitivno 31-bitno celo število).
// 3. korak: Modulno računanje za končne števke
OTP = P mod 106 = P mod 1000000
Z uporabo modula 1.000.000 izoliramo zadnjih 6 decimalnih števk in po potrebi dodamo vodilne ničle (npr. 748 postane »000748«).
🧪 Konkretni testni vektor iz dodatka D k RFC 4226:

Predpostavimo tajni ključ v ASCII "12345678901234567890" in števec C = 0. Nastali izvleček HMAC-SHA1 v šestnajstiški obliki je:

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

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!

03

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):

T = ⌊ (CurrentUnixTime - T0) / X ⌋
  • 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.

Podpora za SHA-256 in SHA-512 v RFC 6238: Medtem ko je RFC 4226 predpisoval izključno HMAC-SHA-1, je RFC 6238 dodal podporo za HMAC-SHA-256 in HMAC-SHA-512. Pri SHA-256 (32-bajtni izvleček) se odmik določi iz bajta 31 (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.
04

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
05

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:

⚙️ Rešitev za HOTP: Okno preverjanja vnaprej (Look-Ahead Window s)

Č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.

⏱️ Rešitev za TOTP: Toleranca časovnega zamika (okno ±1)

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.

Obvezno pravilo proti ponovnemu predvajanju (Anti-Replay): Da bi preprečili ponovno uporabo istega žetona znotraj 90-sekundnega tolerančnega okna, mora strežnik uporabljene žetone hraniti v hitrem predpomnilniku (npr. Redis) 90 sekund in zavrniti podvojene zahteve.
🛡️ Primerjava nizov v konstantnem času (Zaščita pred napadi s časovno analizo):

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.

06

Zakaj je TOTP prevladal na sodobnem spletu

Končna zmaga protokola TOTP nad HOTP na sodobnem internetu je posledica treh temeljnih arhitekturnih prednosti:

☁️ Brezstanovna skalabilnost v oblaku

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.

📱 Sinergija mobilnega ekosistema

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.

🛡️ Ozko 30-sekundno napadalno okno

Ž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.

🧮 Čisti pogon RFC 6238 na strani odjemalca

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.

Odpri spletni generator