- Esminis įvesties skirtumas: HOTP skaičiuoja maišos reikšmes iš monotoniškai didėjančio skaitiklio C, o TOTP skaitiklį C pakeičia epochos laiko žingsniu T (CurrentUnixTime / 30).
- Tiesioginis paveldimumas: TOTP matematiškai yra HOTP specializacija:
TOTP(K, Time) = HOTP(K, T). Abu algoritmai naudoja lygiai tą pačią dinaminio trumpinimo (Dynamic Truncation) funkciją. - Architektūrinis lemiamas veiksnys: HOTP reikalauja būsenos išsaugojimo (stateful) – serveriai privalo užrakinti ir atnaujinti skaitiklius duomenų bazėje po kiekvieno patvirtinimo. TOTP yra bebūsenis (stateless), todėl modernios debesijos mikropaslaugos gali tikrinti kodus paskirstytuose klasteriuose be centralizuotų duomenų bazės įrašymo operacijų.
Istorinės šaknys: nuo patentuotų aparatinės įrangos raktų iki atvirų žiniatinklio standartų
2000-ųjų pradžioje korporatyviniame dviejų veiksnių autentifikavime dominavo patentuoti aparatiniai raktai, tokie kaip „RSA SecurID“. Šiuose uždaruose, brangiuose įrenginiuose buvo įmontuoti vidiniai kvarco kristalai, sinchronizuoti su patentuotais įmonių serveriais. Jei organizacija norėjo suteikti kelių veiksnių saugumą tūkstančiams darbuotojų, įrangos pirkimo ir patentuotų licencijų kaštai buvo milžiniški.
Siekiant išlaisvinti autentifikavimą nuo patentuotų gamintojų monopolijos, pramonės lyderiai įkūrė OATH (Initiative for Open Authentication) konsorciumą, kurio tikslas buvo sukurti atvirus, nemokamus IETF standartus, kuriuos bet kuris programinės įrangos inžinierius galėtų laisvai nagrinėti, įgyvendinti ir audituoti:
HMAC-Based One-Time Password Algorithm. Pritaikytas mažos galios mikrovaldikliams su fiziniu mygtuku. Paspaudus mygtuką, vidinis skaitiklis padidinamas ir LCD ekrane parodomas 6 skaitmenų kodas.
Time-Based One-Time Password Algorithm. Sukurtas sparčiai plintant išmaniesiems telefonams. Naudodamas mobiliojo ryšio NTP tinklo laiko sinchronizaciją, TOTP visiškai panaikino fizinių mygtukų būsenų nesutapimus.
HOTP (RFC 4226) architektūra ir dinaminio trumpinimo baitų mechanizmas
Pagrindinė matematinė HOTP apibrėžtis yra stebėtinai glausta:
Parametrų paaiškinimas:
K: Bendrinamas simetrinis slaptasis raktas (paprastai iš Base32 iškoduota 160 bitų / 20 baitų dvejetainė seka).C: 8 baitų (64 bitų) big-endian sveikasis skaitiklis.HMAC-SHA-1: Raktu apsaugotas pranešimo autentifikavimo kodas, sukuriantis 20 baitų (160 bitų) kriptografinį maišos rezultatą (digest).
🔍 Kaip dinaminis trumpinimas (Dynamic Truncation) paverčia 20 baitų į 6 skaitmenis:
HMAC-SHA1 rezultatas susideda iš 160 bitų (20 baitų). Norint išgauti 6 tolygiai pasiskirsčiusius dešimtainius skaitmenis, reikalingas deterministinis, kolizijoms atsparus parinkimo mechanizmas, aprašytas RFC 4226 5.3 skyriuje:
Tarkime, kad slaptasis raktas yra ASCII "12345678901234567890", o skaitiklis C = 0. Gautas HMAC-SHA1 maišos rezultatas šešioliktainiu formatu:
1. Paskutinis baitas yra 0x71. 0x71 & 0x0F = 0x01, todėl Offset = 1.
2. Baitai nuo 1 iki 4 yra: 93 cf 18 50. Nunulinus MSB gaunama 0x13cf1850, kas dešimtaine sistema yra 332,339,280.
3. 332339280 mod 1000000 = 339280. Galutinis 6 skaitmenų OTP kodas yra 339280!
TOTP (RFC 6238) evoliucija: laiko žingsnio magija
HOTP reikalavo nuolat sinchronizuoti kliento ir serverio skaitiklį. Programinės įrangos įrenginiuose mygtukų ar klavišų paspaudimų skaičiavimas neišvengiamai sukelia žmogiškąsias klaidas.
RFC 6238 skaitiklį C pakeitė diskrečiuoju laiko žingsniu T, išvestu tiesiogiai iš „Unix“ epochos laikrodžio:
- CurrentUnixTime: sekundės, praėjusios nuo 1970-01-01 00:00:00 UTC.
- T0: epochos atskaitos pradžia (visuose šiuolaikiniuose diegimuose lygi 0).
- X (laiko žingsnio langas): standartinė rekomenduojama trukmė – 30 sekundžių.
- Sveikosios dalies funkcija ⌊ ⌋: bet kuriai laiko žymai per 30 sekundžių langą T išlieka griežtai invariantinis. Pavyzdžiui, tarp epochos sekundžių 1728211200 ir 1728211229, T reikšmė yra visiškai tas pats 64 bitų sveikasis skaičius.
Dvejetainė serializacija: apskaičiavus T, jis supakuojamas į 8 baitų big-endian dvejetainį buferį (kurio atminties struktūra visiškai identiška skaitikliui C HOTP algoritme). Todėl bendra formulė tampa:
TOTP(K, Time) = HOTP(K, T)
Ši matematinė elegancija paaiškina, kodėl autentifikavimo programėlės sinchroniškai atnaujina kodus kas 30 sekundžių, nereikalaudamos pastovaus būsenos sinchronizavimo tarp įrenginio ir serverio.
HS[31] & 0x0F); SHA-512 (64 baitų maiša) atveju poslinkis imamas iš 63 baito (HS[63] & 0x0F). Tačiau 99,9 % komercinių svetainių („Google“, „Microsoft“, „GitHub“, AWS) SHA-1 išlieka visuotiniu standartu dėl plataus suderinamumo su senesniais mobiliaisiais klientais.
Išsami palyginimo matrica (HOTP prieš TOTP)
| Aspektas | HOTP (RFC 4226) | TOTP (RFC 6238) |
|---|---|---|
| Įvesties kintamasis | Įvykių skaitiklis C (monotoniškai didėjantis) | Laiko žingsnis T (30 sekundžių „Unix“ epochos langas) |
| Kodo galiojimo laikas | Neterminuotas (galioja, kol bus panaudotas kitam prisijungimui) | Griežtai 30 sekundžių (automatiškai nustoja galioti) |
| Serverio architektūra | Būseninė (stateful – reikalauja atominių įrašų į DB kiekvieno prisijungimo metu) | Bebūsenė (stateless – nepriklausomas NTP tikrinimas) |
| Pakartotinio panaudojimo (replay) rizika | Vidutinė (perimtas kodas galioja iki faktinio panaudojimo) | Minimali (apribota likusiomis dabartinio 30 sek. lango sekundėmis) |
| Pagrindinė gedimo priežastis | Skaitiklio desinchronizacija (atsitiktiniai mygtuko paspaudimai) | Laikrodžio poslinkis (kliento įrenginio laiko netikslumas) |
| Palaikomi maišos algoritmai | Išskirtinai tik HMAC-SHA-1 | HMAC-SHA-1, HMAC-SHA-256, HMAC-SHA-512 |
| Pritaikymas pramonėje | Senieji bankiniai raktai, specializuotos fizinės praėjimo sistemos | 99,9 % šiuolaikinių žiniatinklio autentifikatorių |
Desinchronizacija prieš laiko poslinkį: inžineriniai sprendimai
Paskirstytose gamybinėse sistemose klientų ir serverių parametrai neišvengiamai skiriasi. Kriptografai suprojektavo aiškius kompensavimo langus, užtikrinančius sistemos patikimumą:
Jei vartotojas 5 kartus paspaudžia generatoriaus mygtuką nepateikdamas kodo serveriui, kliento skaitiklis pasiekia C+5, o serveris lieka ties C.
RFC 4226 nurodo, kad autentifikavimo metu serveris apskaičiuoja ateities langą [C+1, C+s] (paprastai s=20). Jei randamas sutapimas, serveris peršoka į priekį ir nedelsdamas sinchronizuoja skaitiklį C.
Dėl tinklo delsos ar kliento įrenginio laikrodžio netikslumo (pvz., telefono laikrodis atsilieka 10 sekundžių), kodai gali atkeliauti gretimuose laiko žingsniuose.
Gamybiniai serveriai tikrina 3 langų masyvą: [T-1, T, T+1], faktiškai išplėsdami priėmimo intervalą iki 90 sekundžių.
Kai serveriai tikrina, ar vartotojo pateiktas kodas atitinka apskaičiuotą kodą, įprastiniai eilučių lygybės patikrinimai (pvz., userOtp === serverOtp) nutraukiami ties pirmuoju nesutampančiu simboliu. Užpuolikas, matuodamas mikroskopinius tinklo atsakymo laikus, gali po vieną atkurti visus skaitmenis. Įmonių sistemų vidinė logika naudoja pastovaus laiko lygybės palyginimus (pvz., crypto.timingSafeEqual „Node.js“ aplinkoje), kad užkirstų kelią šoninio kanalo laiko analizei.
Kodėl TOTP nugalėjo šiuolaikiniame internete
Lemiama TOTP pergalė prieš HOTP visame internete buvo nulemta trijų esminių architektūrinių pranašumų:
Paskirstytose kelių regionų mikropaslaugose bet kuris serveris su NTP sinchronizuotu laikrodžiu gali patvirtinti TOTP kodus be užklausų ar įrašų fiksavimo centralizuotoje duomenų bazėje.
Išmanieji telefonai nuolat kalibruoja savo sistemos laikrodžius per mobiliojo ryšio stotis ir GPS, pašalindami laikrodžio poslinkį be fizinės aparatinės įrangos priežiūros.
HOTP kodai lieka galioti neribotą laiką, kol bus panaudoti. TOTP kodai nustoja galioti per 30 sekundžių, automatiškai neutralizuodami nutekintus žurnalus ir tinklo paketų perėmimą.
Išbandykite realaus laiko TOTP skaičiavimus 2FA-Tool
Pamatykite, kaip jūsų Base32 slaptoji eilutė paverčiama dinaminiais 6 skaitmenų kodais per HMAC-SHA1 dinaminį trumpinimą. 100 % neprisijungus prie tinklo jūsų naršyklėje.
📚 Susiję saugumo gidai
Kaip perkelti 2FA paskyras tarp išmaniųjų telefonų naudojant neprisijungusius QR kodus ir sinchronizavimą debesyje.
Atitikties taisyklės, atkūrimo kodų išsaugojimas, SSH raktų sąveika ir avariniai atkūrimo procesai.
Kaip atkurti prieigą prie „Google“, „Microsoft“, „Steam“, Binance, „Apple“ ir „Discord“ paskyrų.