⏱️ Criptografia i protocols RFC ✓ Anàlisi d'estàndards de l'IETF

TOTP vs HOTP: Diferències arquitectòniques, algorismes i comparativa de seguretat

Milions de desenvolupadors i enginyers de seguretat consulten codis de verificació canviants de 6 dígits cada dia, però pocs comprenen l'elegant mecanisme matemàtic que funciona sota la pantalla. Des dels comptadors basats en esdeveniments de l'RFC 4226 (HOTP) el 2005 fins als passos de temps discrets de l'RFC 6238 (TOTP) el 2011, aquesta guia analitza l'algorisme de truncament dinàmic a nivell de bytes, les vulnerabilitats de desincronització de comptadors, les toleràncies a la desviació temporal i els motius pels quals TOTP ha conquerit la web moderna.

2FA
Equip de seguretat de 2FA-Tool
Actualitzat l'octubre de 2026
Temps estimat de lectura: 10 min de lectura (més de 2.600 paraules)
RFC 6238 RFC 4226 Truncament dinàmic
💡 Conclusions criptogràfiques clau (TL;DR)
  • La diferència fonamental d'entrada: L'HOTP calcula els valors resum a partir d'un comptador C que s'incrementa de manera monòtona, mentre que el TOTP substitueix C per un pas de temps d'època T (TempsUnixActual / 30).
  • Herència directa: El TOTP és matemàticament una especialització de l'HOTP: TOTP(K, Temps) = HOTP(K, T). Ambdós algorismes utilitzen exactament la mateixa funció de truncament dinàmic.
  • Factor arquitectònic decisiu: L'HOTP té estat (els servidors han de bloquejar i persistir els comptadors al disc en cada validació). El TOTP no té estat (stateless), cosa que permet als microserveis al núvol moderns validar testimonis en clústers distribuïts i amb balanceig de càrrega sense necessitat d'operacions d'escriptura centralitzades en bases de dades.
01

Orígens històrics: Dels testimonis de maquinari propietaris als estàndards web oberts

A principis de la dècada del 2000, l'autenticació corporativa en dos passos estava dominada per dispositius de maquinari propietaris com RSA SecurID. Aquests dispositius tancats i cars contenien vidres de quars interns sincronitzats amb servidors empresarials propietaris. Si una organització volia oferir seguretat multifactor a milers d'empleats, l'adquisició de maquinari i els costos de llicències propietàries eren exorbitants.

Per emancipar l'autenticació dels proveïdors propietaris, líders de la indústria van formar el consorci OATH (Initiative for Open Authentication) per oferir estàndards oberts i lliures de drets d'IETF que qualsevol enginyer de programari pogués inspeccionar, implementar i auditar lliurement:

📜 2005: RFC 4226 (HOTP)

Algorisme de contrasenya d'un sol ús basat en HMAC. Dissenyat per a microcontroladors de baix consum amb botons físics. En prémer el botó s'incrementa un comptador intern i es mostra un testimoni de 6 dígits en una pantalla LCD.

📜 2011: RFC 6238 (TOTP)

Algorisme de contrasenya d'un sol ús basat en el temps. Dissenyat amb l'auge dels telèfons intel·ligents. Aprofitant la sincronització horària de xarxa per NTP de la xarxa cel·lular, el TOTP va eliminar completament els desajustos d'estat dels botons físics.

02

Arquitectura de l'HOTP (RFC 4226) i mecànica de bytes del truncament dinàmic

La definició matemàtica bàsica de l'HOTP és enganyosament concisa:

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

Desglossament de paràmetres:

  • K: Clau secreta simètrica compartida (normalment una seqüència binària de 160 bits / 20 bytes descodificada de Base32).
  • C: Enter de 8 bytes (64 bits) en format big-endian que actua com a comptador.
  • HMAC-SHA-1: Codi d'autenticació de missatges basat en hash amb clau que produeix un resum criptogràfic de 20 bytes (160 bits).

🔍 Com converteix el truncament dinàmic (DT) 20 bytes en 6 dígits:

Un resum HMAC-SHA1 conté 160 bits (20 bytes). Extreure 6 dígits decimals uniformes requereix un mecanisme de selecció determinista i resistent a col·lisions definit a la secció 5.3 de l'RFC 4226:

// Pas 1: Càlcul del desplaçament dinàmic
Offset = HS[19] & 0x0F
Es pren l'últim byte (índex 19) del resum de 20 bytes. L'aplicació de la màscara 0x0F aïlla els 4 bits d'ordre inferior, donant lloc a un enter estrictament entre 0 i 15 (de 0x0 a 0xF). Això garanteix que l'extracció posterior de 4 bytes mai no superi el límit del búfer de 20 bytes (ja que 15 + 4 = 19).
// Pas 2: Extracció de 4 bytes consecutius amb màscara
P = ( (HS[Offset] & 0x7F) << 24 ) | ( (HS[Offset+1] & 0xFF) << 16 ) | ( (HS[Offset+2] & 0xFF) << 8 ) | ( HS[Offset+3] & 0xFF )
S'extreuen 4 bytes a partir de la posició Offset. La màscara 0x7F posa a zero el bit més significatiu per evitar desbordaments de nombres enters amb signe entre diverses arquitectures de CPU (assegurant un enter net positiu de 31 bits).
// Pas 3: Aritmètica de mòdul per als dígits finals
OTP = P mod 106 = P mod 1000000
L'aplicació del mòdul 1.000.000 aïlla els 6 dígits decimals finals, emplenant amb zeros a l'esquerra si cal (per exemple, 748 esdevé «000748»).
🧪 Vector de prova concret de l'apèndix D de l'RFC 4226:

Suposem que la clau secreta és la cadena ASCII "12345678901234567890" i el comptador C = 0. El resum HMAC-SHA1 resultant en hexadecimal és:

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

1. L'últim byte és 0x71. 0x71 & 0x0F = 0x01, de manera que Offset = 1.
2. Els bytes de l'1 al 4 són: 93 cf 18 50. Posar a zero el bit més significatiu (MSB) dóna 0x13cf1850, que en decimal equival a 332.339.280.
3. 332339280 mod 1000000 = 339280. L'OTP de 6 dígits resultant és 339280!

03

Evolució del TOTP (RFC 6238): La màgia dels passos de temps

L'HOTP requeria mantenir sincronitzat el comptador del client amb el del servidor. En dispositius de programari, comptar polsacions o clics introdueix un error humà constant.

L'RFC 6238 va substituir el comptador C per un pas de temps discret T derivat directament del rellotge de l'època Unix:

T = ⌊ (TempsUnixActual - T0) / X ⌋
  • TempsUnixActual: Segons transcorreguts des de 1970-01-01 00:00:00 UTC.
  • T0: Referència d'inicialització de l'època (per defecte 0 en totes les implementacions modernes).
  • X (Finestra temporal de pas): Durada recomanada estàndard de 30 segons.
  • Funció d'arrodoniment cap avall ⌊ ⌋: Per a qualsevol marca de temps dins d'una finestra de 30 segons, T es manté invariant. Per exemple, entre els segons d'època 1728211200 i 1728211229, T s'avalua exactament com el mateix enter de 64 bits.

Serialització binària: Un cop calculat T, s'empaqueta en un búfer binari de 8 bytes en format big-endian (idèntic en estructura de memòria al comptador C de l'HOTP). Per tant, la fórmula unificada se simplifica a:
TOTP(K, Temps) = HOTP(K, T) Aquesta elegància matemàtica explica per què les aplicacions d'autenticació renoven els testimonis de forma sincrònica cada 30 segons sense requerir una sincronització d'estat persistent.

Suport de l'RFC 6238 per a SHA-256 i SHA-512: Mentre que l'RFC 4226 definia estrictament HMAC-SHA-1, l'RFC 6238 va ampliar el suport a HMAC-SHA-256 i HMAC-SHA-512. A SHA-256 (resum de 32 bytes), el desplaçament s'obté del byte 31 (HS[31] & 0x0F); a SHA-512 (resum de 64 bytes), s'obté del byte 63 (HS[63] & 0x0F). Tanmateix, en el 99,9% dels llocs web comercials (Google, Microsoft, GitHub, AWS), SHA-1 continua sent el valor predeterminat omnipresent per motius de compatibilitat amb clients mòbils heretats.
04

Matriu comparativa exhaustiva (HOTP vs. TOTP)

Dimensió HOTP (RFC 4226) TOTP (RFC 6238)
Variable d'entrada Comptador d'esdeveniments C (increment monòton) Pas de temps T (finestra d'època Unix de 30 segons)
Temps de vida del testimoni Indefinit (vàlid fins que es consumeix en el següent inici de sessió) Estrictament 30 segons (s'invalida automàticament)
Arquitectura del servidor Amb estat / Stateful (requereix escriptures atòmiques en base de dades per inici de sessió) Sense estat / Stateless (verificació independent amb NTP)
Exposició a atacs de reproducció Moderada (el testimoni interceptat continua sent vàlid fins que s'utilitza) Mínima (restringida als segons restants de la finestra actual)
Modalitat principal de fallada Desincronització del comptador (polsacions accidentals de tecles) Desviació del rellotge (desfasament horari al telèfon del client)
Funcions de resum admeses Exclusivament HMAC-SHA-1 HMAC-SHA-1, HMAC-SHA-256, HMAC-SHA-512
Adopció al sector Claus físiques bancàries heretades, controls d'accés físic especialitzats 99,9% dels autenticadors web moderns
05

Desincronització vs. desviació temporal: Mitigacions tècniques

En entorns de producció distribuïts, els clients i els servidors pateixen desviacions de manera inevitable. Els criptògrafs van dissenyar finestres de compensació explícites per mantenir la fiabilitat:

⚙️ Mitigació a l'HOTP: Finestra de verificació anticipada (s)

Si un usuari prem el botó del testimoni 5 vegades sense enviar el formulari, el comptador del client arriba a C+5 mentre que el servidor es queda a C.
L'RFC 4226 especifica que, en autenticar-se, el servidor calcula una finestra de cerca anticipada (look-ahead) que abasta [C+1, C+s] (habitualment s=20). Si es troba una coincidència, el servidor salta endavant i sincronitza el comptador C immediatament.

⏱️ Mitigació al TOTP: Tolerància a la desviació temporal (finestra ±1)

A causa de la latència de la xarxa o de la desviació del rellotge del dispositiu client (p. ex., un telèfon amb 10 segons de retard), els testimonis poden arribar en passos de temps adjacents.
Els servidors de producció avaluen una matriu de 3 finestres: [T-1, T, T+1], ampliant eficaçment la finestra d'acceptació a 90 segons.

Regla obligatòria contra atacs de reproducció: Per evitar atacs de reproducció dins de la finestra de desviació de 90 segons, els servidors han d'emmagatzemar a la memòria cau (p. ex. Redis) els testimonis consumits durant 90 segons, rebutjant trameses duplicades.
🛡️ Comparació de cadenes en temps constant (Defensa contra atacs de temporització):

Quan els servidors verifiquen si el codi enviat per l'usuari coincideix amb el codi calculat, les comprovacions ingènues d'igualtat de cadenes (com ara userOtp === serverOtp) s'aturen en el primer caràcter no coincident. Un atacant que mesuri diferències microscòpiques en els temps de resposta de la xarxa pot reconstruir els dígits de manera iterativa. Els sistemes empresarials apliquen comparacions d'igualtat en temps constant (p. ex., crypto.timingSafeEqual a Node.js) per neutralitzar l'anàlisi de canals laterals de temporització.

06

Per què el TOTP ha conquerit la internet moderna

El triomf decisiu del TOTP sobre l'HOTP a la web va estar impulsat per tres imperatius arquitectònics:

☁️ Escalabilitat al núvol sense estat (Stateless)

En microserveis distribuïts en múltiples regions, qualsevol instància de servidor amb un rellotge sincronitzat per NTP pot validar testimonis TOTP sense consultar ni bloquejar un registre centralitzat a la base de dades.

📱 Sinergia amb l'ecosistema mòbil

Els telèfons intel·ligents calibren contínuament els seus rellotges del sistema mitjançant antenes de telefonia mòbil i GPS, eliminant la desviació del rellotge sense requerir cap manteniment de maquinari físic.

🛡️ Finestra d'atac reduïda de 30 segons

Els testimonis HOTP continuen sent vàlids indefinidament fins que s'utilitzen. Els testimonis TOTP caduquen en 30 segons, neutralitzant registres compromesos i captures passives de paquets automàticament.

🧮 Motor pur RFC 6238 al costat del client

Experimenteu el càlcul de TOTP en temps real a 2FA-Tool

Comproveu com la vostra cadena secreta Base32 es transforma en codis dinàmics de 6 dígits mitjançant el truncament dinàmic HMAC-SHA1. 100% fora de línia al vostre navegador.

Obrir el generador en línia