⏱️ Kriptogrāfija un RFC protokoli ✓ IETF standartu analīze

TOTP pret HOTP: galvenās atšķirības, drošība un darbības principi

Miljoniem izstrādātāju un drošības inženieru katru dienu ekrānā redz mainīgus 6 ciparu verifikācijas kodus, taču retais saprot eleganto matemātisko mehānismu, kas darbojas aiz tā. No RFC 4226 (HOTP) notikumu vadītajiem skaitītājiem 2005. gadā līdz RFC 6238 (TOTP) diskrētajiem laika soļiem 2011. gadā — šī rokasgrāmata padziļināti pēta baitu līmeņa dinamiskās saīsināšanas (Dynamic Truncation) algoritmu, skaitītāju desinhronizācijas ievainojamības, pulksteņa nobīdes pielaides un iemeslus, kāpēc TOTP iekaroja mūsdienu tīmekli.

2FA
2FA-Tool Drošības komanda
Atjaunināts: 2026. gada oktobris
Paredzamais lasīšanas laiks: 14 min (2600+ vārdi)
RFC 6238 RFC 4226 Dynamic Truncation
💡 Kriptogrāfiskie secinājumi (Īsumā)
  • Būtiskā ievades atšķirība: HOTP aprēķina jaucējkodus no monotoni pieaugoša skaitītāja C, savukārt TOTP aizstāj C ar Unix laikmeta soļa vērtību T (CurrentUnixTime / 30).
  • Tieša pārmantošana: Matemātiski TOTP ir HOTP specializācija: TOTP(K, Time) = HOTP(K, T). Abi algoritmi izmanto tieši to pašu dinamiskās saīsināšanas (Dynamic Truncation) funkciju.
  • Arhitektūras izšķirošais faktors: HOTP ir ar stāvokli (serveriem pēc katras validācijas ir jāfiksē un jāsaglabā skaitītāji diskā). TOTP ir bezstāvokļa (stateless), ļaujot mūsdienu mākoņa mikropakalpojumiem validēt marķierus sadalītos slodzes līdzsvarotajos klasteros bez centralizētām datubāzes rakstīšanas operācijām.
01

Vēsturiskās saknes: no patentētiem aparatūras marķieriem līdz atvērtiem tīmekļa standartiem

2000. gadu sākumā uzņēmumu divfaktoru autentifikācijā dominēja patentēti aparatūras piekariņi, piemēram, RSA SecurID. Šīs slēgtās, dārgās ierīces saturēja iekšējos kvarca kristālus, kas bija sinhronizēti ar patentētiem uzņēmuma serveriem. Ja organizācija vēlējās nodrošināt daudzfaktoru drošību tūkstošiem darbinieku, aparatūras iegādes un patentēto licenču izmaksas bija ārkārtīgi augstas.

Lai atbrīvotu autentifikāciju no patentētu pārdevēju atkarības, nozares līderi izveidoja OATH (Initiative for Open Authentication) konsorciju, lai radītu atvērtus, bezatlīdzības IETF standartus, kurus jebkurš programmatūras inženieris varētu brīvi pārbaudīt, ieviest un auditēt:

📜 2005: RFC 4226 (HOTP)

HMAC-Based One-Time Password Algorithm. Pielāgots mazjaudas mikrokontrolleriem ar fiziskām spiedpogām. Nospiežot pogu, tiek palielināts iekšējais skaitītājs un LCD ekrānā tiek parādīts 6 ciparu marķieris.

📜 2011: RFC 6238 (TOTP)

Time-Based One-Time Password Algorithm. Izstrādāts, strauji pieaugot viedtālruņu popularitātei. Izmantojot mobilo sakaru NTP tīkla laika sinhronizāciju, TOTP pilnībā novērsa fizisko pogu stāvokļa neatbilstības.

02

HOTP (RFC 4226) arhitektūra un dinamiskās saīsināšanas baitu mehānika

HOTP galvenā matemātiskā definīcija ir pārsteidzoši kodolīga:

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

Parametru skaidrojums:

  • K: Kopīga simetriska slepenā atslēga (parasti Base32 dekodēta 160 bitu / 20 baitu binārā secība).
  • C: 8 baitu (64 bitu) big-endian veselo skaitļu skaitītājs.
  • HMAC-SHA-1: Ar atslēgu parakstīts ziņojuma autentifikācijas kods, kas ģenerē 20 baitu (160 bitu) kriptogrāfisko kopsavilkumu.

🔍 Kā dinamiskā saīsināšana (DT) pārvērš 20 baitus par 6 cipariem:

HMAC-SHA1 kopsavilkums satur 160 bitus (20 baitus). Lai iegūtu 6 vienmērīgus decimālos ciparus, ir nepieciešams deterministisks, pret kolīzijām izturīgs atlases mehānisms, kas definēts RFC 4226 5.3. sadaļā:

// 1. solis: Dinamiskās nobīdes (Offset) aprēķināšana
Offset = HS[19] & 0x0F
Ņemiet 20 baitu kopsavilkuma pēdējo baitu (indekss 19). Maskēšana ar 0x0F izolē zemākās pakāpes 4 bitus, dodot veselu skaitli stingri robežās no 0 līdz 15 (no 0x0 līdz 0xF). Tas garantē, ka sekojošā 4 baitu nolasīšana nekad nepārsniegs 20 baitu buferi (jo 15 + 4 = 19).
// 2. solis: 4 secīgu baitu nolasīšana ar maskēšanu
P = ( (HS[Offset] & 0x7F) << 24 ) | ( (HS[Offset+1] & 0xFF) << 16 ) | ( (HS[Offset+2] & 0xFF) << 8 ) | ( HS[Offset+3] & 0xFF )
Nolasiet 4 baitus, sākot no Offset. Maska 0x7F iestata nozīmīgāko bitu uz nulli, lai izvairītos no zīmju pārplūdes dažādās CPU arhitektūrās (nodrošinot pozitīvu 31 bita veselu skaitli).
// 3. solis: Modulo aritmētika gala ciparu iegūšanai
OTP = P mod 106 = P mod 1000000
Piemērojot modulo 1 000 000, tiek iegūti pēdējie 6 decimālie cipari, vajadzības gadījumā papildinot tos ar sākuma nullēm (piemēram, 748 kļūst par "000748").
🧪 Konkrēts testa vektors no RFC 4226 D pielikuma:

Pieņemsim, ka slepenā atslēga ir ASCII "12345678901234567890" un skaitītājs C = 0. Iegūtais HMAC-SHA1 kopsavilkums heksadecimālā formā ir:

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

1. Pēdējais baits ir 0x71. 0x71 & 0x0F = 0x01, tātad Offset = 1.
2. Baiti no 1 līdz 4 ir: 93 cf 18 50. Iestatot MSB uz nulli, iegūstam 0x13cf1850, kas decimālajā sistēmā ir 332 339 280.
3. 332339280 mod 1000000 = 339280. Iegūtais 6 ciparu OTP ir 339280!

03

TOTP (RFC 6238) evolūcija: laika soļa maģija

HOTP gadījumā bija nepieciešams nodrošināt, lai klienta skaitītājs būtu sinhronizēts ar serveri. Programmatūras ierīcēs taustiņu nospiešanas skaitīšana rada pastāvīgas cilvēciskas kļūdas.

RFC 6238 aizstāja skaitītāju C ar diskrētu laika soli T, kas tiek iegūts tieši no Unix laikmeta pulksteņa:

T = ⌊ (CurrentUnixTime - T0) / X ⌋
  • CurrentUnixTime: Pagājušās sekundes kopš 1970-01-01 00:00:00 UTC.
  • T0: Laikmeta inicializācijas atsauce (visās mūsdienu sistēmās pēc noklusējuma 0).
  • X (Laika soļa logs): Standarta ieteicamais ilgums ir 30 sekundes.
  • Noapaļošanas uz leju funkcija ⌊ ⌋: Jebkuram laika zīmogam 30 sekunžu logā T paliek nemainīgs. Piemēram, starp laikmeta sekundēm 1728211200 un 1728211229 T tiek novērtēts kā tieši tas pats 64 bitu veselais skaitlis.

Binārā serializācija: Kad T ir aprēķināts, tas tiek ievietots 8 baitu big-endian binārajā buferī (atmiņas struktūrā identisks skaitītājam C iekš HOTP). Līdz ar to vienotā formula kļūst vienkārša:
TOTP(K, Time) = HOTP(K, T) Šī matemātiskā elegance izskaidro, kāpēc autentifikatora lietotnes sinhroni atjaunina marķierus ik pēc 30 sekundēm, neprasot pastāvīgu stāvokļa sinhronizāciju.

RFC 6238 atbalsts SHA-256 un SHA-512: Kamēr RFC 4226 stingri definēja HMAC-SHA-1, RFC 6238 paplašināja atbalstu HMAC-SHA-256 un HMAC-SHA-512. SHA-256 gadījumā (32 baitu kopsavilkums) nobīde tiek ņemta no 31. baita (HS[31] & 0x0F); SHA-512 gadījumā (64 baitu kopsavilkums) nobīde tiek ņemta no 63. baita (HS[63] & 0x0F). Tomēr 99,9% komerciālo vietņu (Google, Microsoft, GitHub, AWS) SHA-1 joprojām ir visuresošs standarts mantotās mobilo klientu saderības dēļ.
04

Visaptveroša salīdzināšanas matrica (HOTP pret TOTP)

Dimensija HOTP (RFC 4226) TOTP (RFC 6238)
Ievades mainīgais Notikumu skaitītājs C (monotoni pieaugošs) Laika solis T (30 sekunžu Unix laikmeta logs)
Marķiera derīguma termiņš Nenoteikts (derīgs, līdz tiek izmantots nākamajā pieteikšanās reizē) Stingras 30 sekundes (automātiski kļūst nederīgs)
Servera arhitektūra Ar stāvokli (prasa atomārus datubāzes ierakstus katrai pieteikšanās reizei) Bezstāvokļa (neatkarīga NTP verifikācija)
Pakļautība atkārtošanas uzbrukumiem Mērena (pārtvertais marķieris paliek derīgs līdz izmantošanai) Minimāla (ierobežota ar atlikušajām sekundēm pašreizējā logā)
Galvenais atteices veids Skaitītāja desinhronizācija (nejaušas pogas nospiešanas) Pulksteņa nobīde (klienta tālruņa laika nobīde)
Atbalstītie kriptogrāfiskie jaucējkodi Tikai HMAC-SHA-1 HMAC-SHA-1, HMAC-SHA-256, HMAC-SHA-512
Nozares pielietojums Mantotie banku piekariņi, specializēti fiziskie vārti 99,9% mūsdienu tīmekļa autentifikatoru
05

Desinhronizācija pret laika nobīdi: tehniskie risinājumi

Sadalītās produkcijas vidēs klienti un serveri neizbēgami novirzās. Kriptogrāfi izstrādāja skaidrus kompensācijas logus, lai uzturētu uzticamību:

⚙️ HOTP risinājums: Paredzamās pārbaudes logs (s)

Ja lietotājs 5 reizes noklikšķina marķiera pogu bez koda iesniegšanas, klienta skaitītājs sasniedz C+5, kamēr serveris paliek pie C.
RFC 4226 nosaka, ka autentifikācijas laikā serveris aprēķina paredzamo logu diapazonā [C+1, C+s] (parasti s=20). Ja tiek atrasta sakritība, serveris veic lēcienu uz priekšu un nekavējoties sinhronizē skaitītāju C.

⏱️ TOTP risinājums: Laika nobīdes tolerance (±1 logs)

Tīkla aiztures vai klienta ierīces pulksteņa nobīdes dēļ (piemēram, tālruņa pulkstenis atpaliek par 10 sekundēm) marķieri var pienākt blakus esošajos laika soļos.
Produkcijas serveri novērtē 3 logu masīvu: [T-1, T, T+1], efektīvi paplašinot pieņemšanas logu līdz 90 sekundēm.

Obligāts pret-atkārtošanas noteikums: Lai novērstu atkārtošanas uzbrukumus 90 sekunžu nobīdes logā, serveriem ir jāsaglabā un jānobloķē izmantotie marķieri atmiņā (piem., Redis) uz 90 sekundēm, noraidot atkārtotus iesniegumus.
🛡️ Nemainīga laika virkņu salīdzināšana (Aizsardzība pret laika analīzes uzbrukumiem):

Kad serveri pārbauda, vai lietotāja iesniegtais kods atbilst aprēķinātajam kodam, vienkāršas virkņu vienādības pārbaudes (piemēram, userOtp === serverOtp) tiek pārtrauktas pie pirmās nesakrītošās rakstzīmes. Uzbrucējs, mērot mikroskopiskus tīkla atbildes laikus, var iteratīvi rekonstruēt ciparus. Uzņēmumu aizmugursistēmas ievieš nemainīga laika vienādības salīdzinājumus (piem., crypto.timingSafeEqual iekš Node.js), lai novērstu sānu kanālu laika analīzi.

06

Kāpēc TOTP uzvarēja mūsdienu internetā

TOTP pārliecinošo uzvaru pār HOTP visā tīmeklī noteica trīs arhitektūras pamatprasības:

☁️ Bezstāvokļa mērogojamība mākonī

Sadalītos daudzreģionu mikropakalpojumos jebkura servera instance ar NTP sinhronizētu pulksteni var validēt TOTP marķierus, neveicot vaicājumus vai centralizēta datubāzes ieraksta bloķēšanu.

📱 Mobilās ekosistēmas sinerģija

Viedtālruņi nepārtraukti kalibrē savus sistēmas pulksteņus, izmantojot mobilo sakaru bāzes stacijas un GPS, novēršot pulksteņa nobīdi bez nepieciešamības pēc fiziskas aparatūras uzturēšanas.

🛡️ Šaurs 30 sekunžu uzbrukuma logs

HOTP marķieri paliek derīgi nenoteiktu laiku, līdz tiek izmantoti. TOTP marķieri beidzas 30 sekunžu laikā, automātiski neitralizējot kompromitētus žurnālus un pasīvu tīkla pakešu pārtveršanu.

🧮 Tīrs klienta puses RFC 6238 dzinējs

Izmēģiniet reāllaika TOTP aprēķinus 2FA-Tool

Vērojiet, kā jūsu Base32 slepenā virkne pārvēršas dinamiskos 6 ciparu kodos, izmantojot HMAC-SHA1 dinamisko saīsināšanu. 100% bezsaistē jūsu pārlūkprogrammā.

Atvērt tiešsaistes ģeneratoru