⏱️ Krüptograafia ja RFC protokollid ✓ IETF standardite analüüs

TOTP vs HOTP võrdlus: peamised erinevused, turvalisus ja tööpõhimõtted

Miljonid arendajad ja turvaspetsialistid vaatavad iga päev ekraanilt rulluvaid 6-kohalisi kinnituskoode, kuid vähesed mõistavad nende taga töötavat elegantset matemaatikat. Alates 2005. aasta sündmuspõhisest loendurist RFC 4226 (HOTP) kuni 2011. aasta diskreetsete ajasammudeni RFC 6238 (TOTP) – see juhend vaatleb dünaamilise kärpimise algoritmi baiditasemel, loendurite desünkroonimise ohte, kellanihete taluvust ja põhjuseid, miks TOTP vallutas kaasaegse veebi.

2FA
2FA-Tooli turvameeskond
Uuendatud oktoobris 2026
Hinnanguline lugemisaeg: 14 min (2600+ sõna)
RFC 6238 RFC 4226 Dynamic Truncation
💡 Krüptograafilised põhiteadmised (lühikokkuvõte)
  • Põhiline sisendierinevus: HOTP arvutab räsi monotoonselt kasvavast loendurist C, samal ajal kui TOTP asendab loenduri C Unixi ajastust tuletatud ajasammuga T (CurrentUnixTime / 30).
  • Otsene pärilikkus: TOTP on matemaatiliselt HOTP erijuht: TOTP(K, Aeg) = HOTP(K, T). Mõlemad algoritmid kasutavad täpselt sama dünaamilise kärpimise funktsiooni.
  • Arhitektuurne määrav tegur: HOTP on olekuga (stateful) süsteem (serverid peavad iga autentimise järel loenduri lukustama ja kettale kirjutama). TOTP on olekuta (stateless), mis võimaldab kaasaegsetel hajutatud pilveteenustel koode kontrollida ilma keskse andmebaasi kirjutamisteheteta.
01

Ajaloolised juured: suletud riistvaraseadmetest avatud veebistandarditeni

2000. aastate alguses domineerisid ettevõtete kaheastmelises autentimises suletud riistvaralised võtmehoidjad, näiteks RSA SecurID. Need kallid ja patenteeritud seadmed sisaldasid kvartskristalle, mis olid sünkroonitud spetsiaalsete serveritega. Kui organisatsioon soovis pakkuda mitmikautentimist tuhandetele töötajatele, kujunesid riistvara hanke- ja litsentsikulud ülikõrgeks.

Et vabastada autentimine monopoolsete tootjate haardest, lõid tööstusharu liidrid konsortsiumi OATH (Initiative for Open Authentication) eesmärgiga luua avatud ja litsentsitasuta IETF-i standardid, mida iga tarkvarainsener saaks vabalt uurida, teostada ja auditeerida:

📜 2005: RFC 4226 (HOTP)

HMAC-Based One-Time Password Algorithm. Loodud madala voolutarbega mikrokontrolleritele ja füüsilistele nuppudele. Nupuvajutus suurendab sisemist loendurit ja kuvab LCD-ekraanile 6-kohalise koodi.

📜 2011: RFC 6238 (TOTP)

Time-Based One-Time Password Algorithm. Loodud nutitelefonide kiire leviku ajastul. Kasutades mobiilsidevõrgu NTP ajasünkroonimist, kõrvaldas TOTP füüsiliste nupuvajutuste ja loendurite ebakõlad täielikult.

02

HOTP (RFC 4226) arhitektuur ja dünaamilise kärpimise baidimehaanika

HOTP põhimine matemaatiline määratlus on üllatavalt kompaktne:

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

Parameetrite selgitus:

  • K: Jagatud sümmeetriline salavõti (tavaliselt Base32-st dekodeeritud 160-bitine / 20-baidine binaarne jada).
  • C: 8-baidine (64-bitine) big-endian täisarvuline loendur.
  • HMAC-SHA-1: Võtmega räsifunktsioon, mis tekitab 20-baidise (160-bitise) krüptograafilise räsi.

🔍 Kuidas dünaamiline kärpimine (Dynamic Truncation, DT) teisendab 20 baiti 6 numbriks:

HMAC-SHA1 räsi sisaldab 160 bitti (20 baiti). Sellest 6 ühtlase jaotusega kümnendkoha saamiseks on vaja deterministlikku ja kollisionikindlat valikumehhanismi, mis on määratletud RFC 4226 jaotises 5.3:

// Samm 1: Dünaamilise nihke (Offset) arvutamine
Offset = HS[19] & 0x0F
Võetakse 20-baidise räsi viimane bait (indeksiga 19). Maskimine väärtusega 0x0F eraldab madalamad 4 bitti, andes täisarvu vahemikus 0 kuni 15 (0x0 kuni 0xF). See tagab, et järgnev 4-baidine väljavõte ei ületa kunagi 20-baidist puhvrit (sest 15 + 4 = 19).
// Samm 2: 4 järjestikuse baidi eraldamine maskimisega
P = ( (HS[Offset] & 0x7F) << 24 ) | ( (HS[Offset+1] & 0xFF) << 16 ) | ( (HS[Offset+2] & 0xFF) << 8 ) | ( HS[Offset+3] & 0xFF )
Eraldatakse 4 baiti alates nihkest (Offset). Mask 0x7F nullib kõige kõrgema biti, et vältida märgiga täisarvu ületäitumist erinevates protsessorites (tagades puhta positiivse 31-bitise täisarvu).
// Samm 3: Modulo-aritmeetika lõplike numbrite saamiseks
OTP = P mod 106 = P mod 1000000
Rakendades modulo 1 000 000 eraldatakse viimased 6 kümnendkohta ja vajadusel lisatakse vasakule nullid (nt 748 muutub kujule "000748").
🧪 Konkreetne testvektor RFC 4226 lisast D:

Oletame, et salavõti on ASCII sõne "12345678901234567890" ja loendur C = 0. Tulemuseks olev HMAC-SHA1 räsi kuueteistkümnendsüsteemis on:

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

1. Viimane bait on 0x71. Tehe 0x71 & 0x0F = 0x01 annab tulemuseks Offset = 1.
2. Baidid 1 kuni 4 on: 93 cf 18 50. Kõrgeima biti nullimine annab 0x13cf1850, mis kümnendsüsteemis on 332 339 280.
3. 332339280 mod 1000000 = 339280. Tulemuseks olev 6-kohaline OTP on 339280!

03

TOTP (RFC 6238) areng: ajasammu maagia

HOTP nõudis kliendi loenduri pidevat sünkroonis hoidmist serveriga. Tarkvaraseadmetes tekitab klahvivajutuste või nupuvajutuste loendamine paratamatult inimlikke vigu.

RFC 6238 asendas loenduri C diskreetse ajasammuga T, mis tuletatakse otse Unixi ajastust:

T = ⌊ (CurrentUnixTime - T0) / X ⌋
  • CurrentUnixTime: Sekundid, mis on möödunud alates 1970-01-01 00:00:00 UTC.
  • T0: Alguspunkt (kõikides kaasaegsetes lahendustes vaikimisi 0).
  • X (Ajasammu pikkus): Standardne soovitatav ajavahemik on 30 sekundit.
  • Ümardusfunktsioon ⌊ ⌋: Iga ajatempli puhul 30-sekundilises aknas jääb T muutumatuks. Näiteks sekundite 1728211200 ja 1728211229 vahel annab T täpselt sama 64-bitise täisarvu.

Binaarne seerialiseerimine: Pärast T arvutamist pakitakse see 8-baidisesse big-endian kahendpuhvrisse (struktuurilt identne loenduriga C HOTP-s). Seetõttu lihtsustub ühtne valem kujule:
TOTP(K, Aeg) = HOTP(K, T) See matemaatiline elegants selgitab, miks autentimisrakendused uuendavad koode sünkroonselt iga 30 sekundi järel ilma püsivat olekusünkroonimist vajamata.

RFC 6238 tugi SHA-256 ja SHA-512 algoritmidele: Kuigi RFC 4226 määratles rangelt HMAC-SHA-1, laiendas RFC 6238 tuge ka algoritmidele HMAC-SHA-256 ja HMAC-SHA-512. Algoritmis SHA-256 (32-baidine räsi) võetakse nihe baidist 31 (HS[31] & 0x0F); algoritmis SHA-512 (64-baidine räsi) baidist 63 (HS[63] & 0x0F). Sellegipoolest kasutab 99,9% kommertsveebisaitidest (Google, Microsoft, GitHub, AWS) mobiilirakenduste laia ühilduvuse tõttu endiselt vaikimisi SHA-1 räsi.
04

Põhjalik võrdlusmaatriks (HOTP vs. TOTP)

Mõõde HOTP (RFC 4226) TOTP (RFC 6238)
Sisendmuutuja Sündmuste loendur C (monotoonselt suurenev) Ajasamm T (30-sekundiline Unixi ajastu aken)
Koodi kehtivusaeg Määramata (kehtib kuni järgmise sisselogimiseni) Rangelt 30 sekundit (aegub automaatselt)
Serveri arhitektuur Olekuga (nõuab igal sisselogimisel andmebaasi kirjutamist) Olekuta (sõltumatu NTP-kontroll)
Kordusrünnaku risk Mõõdukas (pealtkuulatud kood kehtib kuni ärakasutamiseni) Minimaalne (piiratud aktiivse 30-sekundilise aknaga)
Peamine tõrkerežiim Loendurite desünkroonimine (juhuslikud nupuvajutused) Kella nihe (telefoni süsteemiaja kõrvalekalle)
Toetatud räsifunktsioonid Eksklusiivselt HMAC-SHA-1 HMAC-SHA-1, HMAC-SHA-256, HMAC-SHA-512
Levik tänapäeval Vanemad pangandusseadmed, spetsiifilised läbipääsusüsteemid 99,9% kaasaegsetest veebiautentijatest
05

Desünkroonimine vs. ajanihe: tehnilised leevendusmeetmed

Hajutatud tootmiskeskkondades tekib paratamatult ajanihe või olekuhälve. Krüptograafid töötasid töökindluse tagamiseks välja konkreetsed tolerantsiaknad:

⚙️ HOTP lahendus: Ettenägev kontrolliaken (Look-Ahead Window, s)

Kui kasutaja vajutab seadme nuppu 5 korda ilma sisse logimata, jõuab kliendi loendur väärtuseni C+5, samal ajal kui serveri väärtuseks jääb C.
RFC 4226 sätestab, et autentimisel arvutab server ettevaatava akna vahemikus [C+1, C+s] (tavaliselt s=20). Kui kood klapib mõne väärtusega selles aknas, liigub server kohe ettepoole ja sünkroonib loenduri C.

⏱️ TOTP lahendus: Kella nihke tolerants (±1 samm)

Võrgu viivituse või kliendiseadme kellahälbe tõttu (nt telefon on 10 sekundit maas) võivad koodid saabuda naaberasammudes.
Tootmisserverid kontrollivad 3 aknast koosnevat massiivi: [T-1, T, T+1], laiendades tegeliku heakskiitmise akna 90 sekundini.

Kohustuslik kordusrünnakute vastane reegel: Kordusrünnakute vältimiseks 90-sekundilises tolerantsiaknas peavad serverid kasutatud koodid 90 sekundiks mällu (nt Redis) salvestama ja dubleeritud päringud tagasi lükkama.
🛡️ Konstantse ajaga sõnevõrdlus (külgkanali ajastusrünnakute tõrjumine):

Kui server kontrollib esitatud koodi vastavust arvutatud koodile, katkestavad tavalised stringivõrdlused (nagu userOtp === serverOtp) töö esimese vale märgi juures. Ründaja, kes mõõdab mikroskoopilisi võrguviiteid, saab numbreid järjestikku tuletada. Ettevõtte tasemel süsteemid jõustavad seetõttu konstantse ajaga võrdlusi (nt crypto.timingSafeEqual Node.js-is või crypto/subtle.ConstantTimeCompare Go-s).

06

Miks TOTP võitis tänapäeva interneti

TOTP ülekaaluka võidu HOTP ees veebis tingisid kolm peamist arhitektuurilist eelist:

☁️ Olekuta pilveskaleeritavus

Hajutatud mitme regiooniga mikroteenustes saab iga NTP-ga sünkroonitud serveri eksemplar TOTP-koode kontrollida ilma keskset andmebaasi pärimata või lukustamata.

📱 Sünergia mobiilse ökosüsteemiga

Nutitelefonid kalibreerivad oma süsteemiaega pidevalt mobiilimastide ja GPS-i kaudu, kõrvaldades kellanihked ilma riistvaralise hooldusvajaduseta.

🛡️ Kitsas 30-sekundiline ründeaken

HOTP koodid kehtivad määramata aja kuni kasutamiseni. TOTP koodid aeguvad 30 sekundi jooksul, neutraliseerides lekkinud logid ja pakettide passiivse pealtkuulamise automaatselt.

🧮 Puhas kliendipoolne RFC 6238 mootor

Koge reaalajas TOTP-arvutusi 2FA-Toolis

Vaata, kuidas sinu Base32 salavõti teisendatakse dünaamilisteks 6-kohalisteks koodideks HMAC-SHA1 kärpimise teel. 100% võrguühenduseta sinu brauseris.

Ava veebigeneraator