⏱️ Criptografie & Protocoale RFC ✓ Analiză a standardelor IETF

TOTP vs HOTP explicat: Diferențe fundamentale, securitate și principii de funcționare

Milioane de dezvoltatori și ingineri de securitate privesc în fiecare zi coduri dinamice de verificare din 6 cifre, însă puțini înțeleg arhitectura matematică elegantă care operează sub suprafața ecranului. De la contoarele orientate pe evenimente din RFC 4226 (HOTP) în 2005 până la pașii de timp discreți din RFC 6238 (TOTP) în 2011, acest ghid examinează algoritmul de trunchiere dinamică la nivel de octet, vulnerabilitățile legate de desincronizarea contoarelor, toleranța la decalajele de ceas și motivele pentru care TOTP a cucerit internetul modern.

2FA
Echipa de Inginerie a Securității 2FA-Tool
Actualizat: octombrie 2026
Timp estimat de citire: 14 min (peste 2.600 de cuvinte)
RFC 6238 RFC 4226 Dynamic Truncation
💡 Concluzii criptografice cheie (TL;DR)
  • Diferența fundamentală a parametrului de intrare: HOTP calculează hash-urile folosind un contor strict crescător C, în timp ce TOTP înlocuiește C cu un pas de timp discret din epoca Unix T (CurrentUnixTime / 30).
  • Moștenire directă: TOTP este din punct de vedere matematic o specializare a algoritmului HOTP: TOTP(K, Time) = HOTP(K, T). Ambii algoritmi utilizează exact aceeași funcție de trunchiere dinamică (Dynamic Truncation).
  • Factorul arhitectural decisiv: HOTP necesită păstrarea stării (serverele trebuie să blocheze și să scrie atomic contorul pe disc la fiecare autentificare). TOTP este complet lipsit de stare (stateless), permițând microserviciilor cloud distribuite să verifice tokenurile fără operațiuni de scriere într-o bază de date centralizată.
01

Rădăcini istorice: De la dispozitive hardware brevetate la standarde web deschise

La începutul anilor 2000, autentificarea corporativă cu doi factori era dominată de generatoare fizice de coduri brevetate, precum cele din seria RSA SecurID. Aceste dispozitive scumpe și cu software proprietar conțineau oscilatoare interne cu cuarț sincronizate cu servere企业 dedicate ale furnizorului. Dacă o organizație dorea să ofere securitate multifactor pentru mii de angajați, costurile de achiziție a echipamentelor și de licențiere deveneau exorbitante.

Pentru a elibera piața de dependența față de soluțiile proprietare, liderii din industrie au creat consorțiul OATH (Initiative for Open Authentication), având drept misiune elaborarea de standarde IETF deschise și gratuite pe care orice inginer software să le poată inspecta, implementa și audita liber:

📜 2005: RFC 4226 (HOTP)

HMAC-Based One-Time Password Algorithm. Conceput pentru microcontrolere cu consum redus de energie și buton fizic. Apăsarea butonului incrementează un contor intern și generează un token din 6 cifre pe un ecran LCD.

📜 2011: RFC 6238 (TOTP)

Time-Based One-Time Password Algorithm. Lansat odată cu expansiunea smartphone-urilor. Utilizând sincronizarea temporală NTP prin rețelele celulare, TOTP a eliminat definitiv problema desincronizării contoarelor fizice.

02

Arhitectura HOTP (RFC 4226) și mecanica pe octeți a trunchierii dinamice

Definiția matematică esențială a algoritmului HOTP este deosebit de concisă și elegantă:

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

Detalierea parametrilor:

  • K: Cheia secretă simetrică partajată (de obicei un șir Base32 decodat într-o secvență binară de 160 biți / 20 octeți).
  • C: Contor întreg pe 8 octeți (64 biți) reprezentat în format big-endian.
  • HMAC-SHA-1: Cod de autentificare a mesajelor bazat pe funcție de dispersie, generând un rezumat de 20 octeți (160 biți).

🔍 Cum convertește trunchierea dinamică (Dynamic Truncation) 20 de octeți în 6 cifre:

Un rezumat HMAC-SHA1 conține 160 biți (20 octeți). Extragerea a 6 cifre zecimale uniforme necesită un mecanism determinist și rezistent la coliziuni, specificat în Secțiunea 5.3 a RFC 4226:

// Pasul 1: Calcularea decalajului dinamic (Offset)
Offset = HS[19] & 0x0F
Se extrage ultimul octet (indexul 19) al rezumatului de 20 de octeți. Mascarea pe biți cu 0x0F izolează cei 4 biți inferiori, rezultând un întreg situat strict între 0 și 15 (0x0 - 0xF). Acest lucru garantează că citirea ulterioară a 4 octeți nu va depăși niciodată capacitatea bufferului de 20 de octeți (15 + 4 = 19).
// Pasul 2: Extragerea a 4 octeți consecutivi cu mascare
P = ( (HS[Offset] & 0x7F) << 24 ) | ( (HS[Offset+1] & 0xFF) << 16 ) | ( (HS[Offset+2] & 0xFF) << 8 ) | ( HS[Offset+3] & 0xFF )
Se extrag 4 octeți începând de la poziția Offset. Masca 0x7F anulează cel mai semnificativ bit (MSB) pentru a evita erorile de semn pe diferite arhitecturi de procesoare, asigurând un număr pozitiv curat pe 31 de biți.
// Pasul 3: Operația modulo pentru obținerea cifrelor finale
OTP = P mod 106 = P mod 1000000
Aplicarea operației modulo 1.000.000 izolează ultimele 6 cifre zecimale, adăugând zerouri la început dacă numărul extras este mai scurt (de exemplu, 748 devine "000748").
🧪 Vector concret de testare din Anexa D a RFC 4226:

Presupunând că secretul partajat este șirul ASCII "12345678901234567890" și contorul este C = 0, rezumatul HMAC-SHA1 generat în format hexazecimal este:

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

1. Ultimul octet este 0x71. Calculul 0x71 & 0x0F = 0x01 stabilește Offset = 1.
2. Octeții de la indexul 1 la 4 sunt: 93 cf 18 50. Mascarea bitului MSB generează 0x13cf1850, care în baza 10 este egal cu 332.339.280.
3. 332339280 mod 1000000 = 339280. Codul OTP rezultat este 339280!

03

Evoluția TOTP (RFC 6238): Magia pasului de timp

HOTP impunea menținerea permanentă a sincronizării contorului de pe dispozitivul client cu cel de pe server. Pe dispozitivele software, contorizarea apăsărilor de taste produce erori frecvente de utilizare.

RFC 6238 a înlocuit contorul incremental C cu un pas discret de timp T derivat direct din ceasul epocii Unix:

T = ⌊ (CurrentUnixTime - T0) / X ⌋
  • CurrentUnixTime: Numărul de secunde scurse de la 1970-01-01 00:00:00 UTC.
  • T0: Valoarea de referință a epocii (implicit 0 în toate sistemele web moderne).
  • X (Fereastra pasului de timp): Intervalul standard recomandat de 30 de secunde.
  • Funcția de rotunjire în jos ⌊ ⌋: Pentru orice secundă din interiorul intervalului de 30 de secunde, T rămâne neschimbat. De exemplu, între secundele 1728211200 și 1728211229, T produce exact același număr întreg pe 64 de biți.

Serializarea binară: După calcularea lui T, acesta este împachetat într-un buffer de 8 octeți în format big-endian (identic ca structură în memorie cu contorul C din HOTP). În consecință, ecuația unificată devine:
TOTP(K, Time) = HOTP(K, T) Această eleganță matematică explică de ce aplicațiile de autentificare schimbă codurile sincron la fiecare 30 de secunde fără a avea nevoie de o conexiune de rețea permanentă.

Suportul din RFC 6238 pentru algoritmii SHA-256 și SHA-512: În timp ce RFC 4226 specifica exclusiv HMAC-SHA-1, RFC 6238 a extins suportul și pentru HMAC-SHA-256 și HMAC-SHA-512. În cazul SHA-256 (rezumat de 32 octeți), decalajul este preluat din octetul 31 (HS[31] & 0x0F); în cazul SHA-512 (rezumat de 64 octeți), decalajul este preluat din octetul 63 (HS[63] & 0x0F). Cu toate acestea, pe 99,9% dintre site-urile comerciale (Google, Microsoft, GitHub, AWS), SHA-1 rămâne alegerea implicită datorită compatibilității istorice cu dispozitivele mobile vechi.
04

Matrice comparativă detaliată (HOTP vs. TOTP)

Dimensiune HOTP (RFC 4226) TOTP (RFC 6238)
Variabilă de intrare Contor de evenimente C (strict crescător) Pas de timp T (fereastră de 30 secunde în epoca Unix)
Durată de valabilitate a tokenului Nedeterminată (valabil până la următoarea autentificare) Strict 30 de secunde (expirare automată)
Arhitectură de server Cu stare (necesită scrieri atomice în baza de date la fiecare login) Fără stare (verificare independentă bazată pe ceasul NTP)
Expunere la atacuri de rejucare (Replay) Moderată (un cod interceptat rămâne valid până la consumare) Minimă (limitată la secundele rămase în fereastra curentă)
Cauză principală de indisponibilitate Desincronizarea contorului (apăsări accidentale pe buton) Decalajul de ceas (diferențe de fus orar sau ceas întârziat)
Hash-uri criptografice suportate Exclusiv HMAC-SHA-1 HMAC-SHA-1, HMAC-SHA-256, HMAC-SHA-512
Grad de adopție în industrie Dispozitive bancare vechi, bariere fizice speciale 99,9% dintre autentificatoarele web moderne
05

Desincronizare vs. Decalaj temporal: Soluții inginerești

În mediile distribuite de producție, clienții și serverele pot înregistra ușoare discrepanțe temporale. Experții în criptografie au conceput ferestre explicite de compensare pentru a menține o fiabilitate optimă:

⚙️ Soluția HOTP: Fereastra de căutare înainte (Look-Ahead Window s)

Dacă un utilizator apasă butonul generatorului de 5 ori fără a introduce codul, contorul de pe client ajunge la C+5, în timp ce serverul rămâne la valoarea C.
Standardul RFC 4226 precizează că la autentificare serverul va căuta o potrivire într-o fereastră extinsă [C+1, C+s] (de obicei s=20). Când găsește un cod valid, serverul avansează și resincronizează imediat contorul C.

⏱️ Soluția TOTP: Toleranța la decalajul temporal (Fereastra ±1)

Din cauza latenței de rețea sau a decalajului ceasului telefonului (de exemplu, un ceas care rămâne în urmă cu 10 secunde), tokenurile pot sosi în pasul adiacent.
Serverele de producție verifică un tablou de 3 pași: [T-1, T, T+1], extinzând practic intervalul de acceptare la 90 de secunde.

Regulă obligatorie anti-rejucare (Anti-Replay): Pentru a bloca atacurile de tip replay în cadrul ferestrei de 90 de secunde, serverele trebuie să rețină și să blocheze în memorie (de exemplu, prin Redis) tokenurile deja consumate timp de 90 de secunde, refuzând cererile duplicat.
🛡️ Comparația șirurilor în timp constant (Protecție împotriva atacurilor de sincronizare):

Când un server verifică dacă un cod trimis corespunde valorii calculate, verificarea naivă de egalitate (de tip userOtp === serverOtp) se întrerupe la primul caracter incorect. Un atacator care măsoară timpul de răspuns la nivel de microsecunde poate deduce treptat cifrele. Sistemele back-end de producție impun verificarea în timp constant (precum crypto.timingSafeEqual în Node.js) pentru a neutraliza atacurile pe canal lateral.

06

De ce TOTP a cucerit internetul modern

Triumful categoric al TOTP în fața HOTP pe web a fost determinat de trei avantaje arhitecturale majore:

☁️ Scalabilitate fără stare în cloud

În microserviciile distribuite multi-regiune, orice instanță cu ceasul sincronizat prin NTP poate verifica tokenurile TOTP fără a interoga sau bloca o bază de date centralizată.

📱 Sinergia cu ecosistemul smartphone-urilor

Telefoanele inteligente își calibrează automat ceasul intern prin intermediul rețelelor celulare și al GPS-ului, eliminând decalajul temporal fără operațiuni manuale de mentenanță.

🛡️ Fereastră îngustă de atac de 30 de secunde

Tokenurile HOTP rămân valide pe termen nelimitat până la consumare. Tokenurile TOTP expiră în 30 de secunde, neutralizând automat fișierele de jurnal expuse sau capturile pasive de pachete.

🧮 Motor pur RFC 6238 pe partea de client

Experimentează calculele TOTP în timp real în 2FA-Tool

Observă cum șirul tău secret Base32 se transformă în coduri dinamice de 6 cifre prin trunchierea dinamică HMAC-SHA1. 100% offline și securizat în browserul tău.

Deschide generatorul online