⏱️ Crittografia & Protocolli RFC ✓ Analisi degli Standard IETF

TOTP vs HOTP Spiegati: Differenze Fondamentali, Sicurezza e Principi di Funzionamento

Milioni di sviluppatori e ingegneri della sicurezza osservano ogni giorno codici di verifica a 6 cifre che ruotano continuamente, ma pochi comprendono l'elegante meccanismo matematico che opera dietro lo schermo. Dai contatori basati su eventi di RFC 4226 (HOTP) nel 2005 agli intervalli temporali discreti di RFC 6238 (TOTP) nel 2011, questa guida esamina l'algoritmo di Dynamic Truncation a livello di byte, le vulnerabilità di desincronizzazione dei contatori, le tolleranze di clock drift e il motivo per cui TOTP ha conquistato il web moderno.

2FA
Team di Ingegneria della Sicurezza 2FA-Tool
Aggiornato a Ottobre 2026
Tempo di lettura stimato: 14 min (oltre 2.600 parole)
RFC 6238 RFC 4226 Dynamic Truncation
💡 Punti Chiave Crittografici (TL;DR)
  • La Differenza Fondamentale dell'Input: HOTP calcola gli hash da un contatore C monotonicamente crescente, mentre TOTP sostituisce C con un intervallo temporale epoch T (CurrentUnixTime / 30).
  • Eredità Diretta: Matematicamente, TOTP è una specializzazione di HOTP: TOTP(K, Time) = HOTP(K, T). Entrambi gli algoritmi impiegano esattamente la stessa funzione di Dynamic Truncation.
  • Fattore Architetturale Decisivo: HOTP è stateful (i server devono acquisire lock e salvare i contatori su disco a ogni singola convalida). TOTP è stateless, consentendo ai moderni microservizi cloud di convalidare i token attraverso cluster bilanciati distribuiti senza operazioni di scrittura centralizzate su database.
01

Radici Storiche: Dai Token Hardware Proprietari agli Standard Web Aperti

Nei primi anni 2000, l'autenticazione a due fattori aziendale era dominata da token fisici hardware proprietari come RSA SecurID. Questi dispositivi chiusi e costosi contenevano al loro interno oscillatori a cristallo di quarzo sincronizzati con server aziendali proprietari. Se un'organizzazione desiderava dotare di sicurezza multi-fattore migliaia di dipendenti, i costi di acquisizione dell'hardware e le licenze commerciali proprietarie risultavano esorbitanti.

Per emancipare i sistemi di autenticazione dai singoli vendor proprietari, i leader del settore hanno fondato il consorzio OATH (Initiative for Open Authentication) con l'obiettivo di realizzare standard IETF aperti e privi di royalty, che qualsiasi ingegnere del software potesse esaminare, implementare e verificare liberamente:

📜 2005: RFC 4226 (HOTP)

HMAC-Based One-Time Password Algorithm. Progettato inizialmente per microcontrollori a basso consumo con pulsanti meccanici fisici. La pressione del pulsante incrementa un contatore interno e visualizza un token a 6 cifre su uno schermo LCD.

📜 2011: RFC 6238 (TOTP)

Time-Based One-Time Password Algorithm. Concepito durante la rapida ascesa degli smartphone. Sfruttando la sincronizzazione oraria della rete cellulare tramite il protocollo NTP, TOTP ha eliminato definitivamente le discrepanze di stato derivanti dai pulsanti fisici.

02

Architettura HOTP (RFC 4226) e Meccanica Byte per Byte della Dynamic Truncation

La formulazione matematica centrale di HOTP è straordinariamente concisa:

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

Descrizione dei Parametri:

  • K: Chiave segreta simmetrica condivisa (tipicamente una sequenza binaria di 160 bit / 20 byte ricavata dalla decodifica Base32).
  • C: Contatore intero big-endian a 8 byte (64 bit).
  • HMAC-SHA-1: Codice di autenticazione del messaggio basato su hash che produce un digest crittografico di 20 byte (160 bit).

🔍 Come la Dynamic Truncation (DT) Converte 20 Byte in 6 Cifre:

Un digest HMAC-SHA1 contiene 160 bit (20 byte). L'estrazione di 6 cifre decimali uniformi richiede un meccanismo di selezione deterministico e resistente alle collisioni, formalizzato nella Sezione 5.3 di RFC 4226:

// Passo 1: Calcolo dell'Offset Dinamico
Offset = HS[19] & 0x0F
Si estrae l'ultimo byte (indice 19) del digest a 20 byte. L'operazione di mascheramento bit a bit con 0x0F isola i 4 bit di ordine inferiore, restituendo un numero intero compreso rigorosamente tra 0 e 15 (da 0x0 a 0xF). Questo garantisce che la successiva estrazione di 4 byte non superi mai i limiti del buffer da 20 byte (poiché 15 + 4 = 19).
// Passo 2: Estrazione di 4 Byte Consecutivi con Mascheramento
P = ( (HS[Offset] & 0x7F) << 24 ) | ( (HS[Offset+1] & 0xFF) << 16 ) | ( (HS[Offset+2] & 0xFF) << 8 ) | ( HS[Offset+3] & 0xFF )
Si estraggono 4 byte consecutivi a partire da Offset. La maschera 0x7F azzera il bit più significativo (MSB) per scongiurare l'overflow di interi con segno su svariate architetture CPU (garantendo un intero positivo pulito a 31 bit).
// Passo 3: Aritmetica Modulo per le Cifre Finali
OTP = P mod 106 = P mod 1000000
L'applicazione del modulo 1.000.000 isola le ultime 6 cifre decimali, aggiungendo gli zeri iniziali qualora necessario (ad esempio 748 diventa "000748").
🧪 Vettore di Test Concreto dall'Appendice D di RFC 4226:

Supponiamo che la chiave segreta in formato ASCII sia "12345678901234567890" e il Contatore sia C = 0. Il digest HMAC-SHA1 risultante in formato esadecimale è:

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

1. L'ultimo byte è 0x71. 0x71 & 0x0F = 0x01, quindi Offset = 1.
2. I byte da 1 a 4 sono: 93 cf 18 50. Azzerando il bit MSB si ottiene 0x13cf1850, che in formato decimale corrisponde a 332.339.280.
3. 332339280 mod 1000000 = 339280. L'OTP a 6 cifre risultante è 339280!

03

L'Evoluzione di TOTP (RFC 6238): La Magia del Time-Step

HOTP richiedeva di mantenere costantemente allineato il contatore del client con quello del server. Nelle implementazioni software, il conteggio degli eventi o delle pressioni dei pulsanti causava frequenti errori operativi umani.

RFC 6238 ha sostituito il contatore C con un intervallo temporale discreto T calcolato direttamente dal clock Unix epoch:

T = ⌊ (CurrentUnixTime - T0) / X ⌋
  • CurrentUnixTime: Secondi trascorsi dal 1970-01-01 00:00:00 UTC.
  • T0: Riferimento di inizializzazione epoch (impostato su 0 in tutte le moderne implementazioni).
  • X (Finestra Temporale / Time Step Window): Durata standard raccomandata di 30 secondi.
  • Funzione Floor ⌊ ⌋: Per qualsiasi timestamp all'interno di una finestra di 30 secondi, T rimane invariato. Ad esempio, tra i secondi epoch 1728211200 e 1728211229, T produce esattamente lo stesso intero a 64 bit.

Serializzazione Binaria: Una volta calcolato T, questo viene impacchettato in un buffer binario big-endian a 8 byte (avente la medesima struttura di memoria del contatore C in HOTP). Di conseguenza, la formula unificata si esprime semplicemente come:
TOTP(K, Time) = HOTP(K, T) Questa eleganza matematica spiega il motivo per cui le applicazioni di autenticazione rinnovano i token in modo sincrono ogni 30 secondi senza richiedere sincronizzazioni di stato persistenti.

Supporto di RFC 6238 per SHA-256 e SHA-512: Mentre RFC 4226 specificava rigorosamente HMAC-SHA-1, RFC 6238 ha ampliato il supporto a HMAC-SHA-256 e HMAC-SHA-512. In SHA-256 (digest a 32 byte), l'offset viene ricavato dal byte 31 (HS[31] & 0x0F); in SHA-512 (digest a 64 byte), l'offset viene ricavato dal byte 63 (HS[63] & 0x0F). Tuttavia, nel 99,9% dei servizi commerciali sul web (Google, Microsoft, GitHub, AWS), SHA-1 rimane lo standard dominante per garantire compatibilità con l'intero parco client legacy.
04

Matrice di Confronto Completa (HOTP vs. TOTP)

Dimensione HOTP (RFC 4226) TOTP (RFC 6238)
Variabile di Input Contatore di Eventi C (monotonicamente crescente) Intervallo Temporale T (finestra epoch Unix di 30 secondi)
Durata del Token Indefinita (valido fino all'utilizzo al login successivo) Rigorosamente 30 secondi (scadenza automatica)
Architettura del Server Stateful (richiede scritture atomiche su database a ogni login) Stateless (convalida indipendente basata su NTP)
Esposizione ad Attacchi Replay Moderata (il token intercettato rimane valido fino all'uso) Minima (limitata ai secondi restanti nella finestra attiva)
Principale Modalità di Guasto Desincronizzazione del Contatore (pressioni accidentali) Clock Drift (disallineamento dell'orologio del client)
Hash Crittografici Supportati Esclusivamente HMAC-SHA-1 HMAC-SHA-1, HMAC-SHA-256, HMAC-SHA-512
Adozione nel Settore Token bancari obsoleti, varchi fisici industriali 99,9% dei moderni autenticatori web
05

Desincronizzazione vs. Time Drift: Soluzioni Tecniche di Ingegneria

Negli ambienti di produzione distribuiti, le discrepanze temporali tra client e server sono inevitabili. Gli esperti di crittografia hanno ideato finestre di tolleranza esplicite per garantire la continuità del servizio:

⚙️ Mitigazione HOTP: Finestra di Verifica Look-Ahead (s)

Se un utente preme il pulsante del token 5 volte senza completare il login, il contatore del client sale a C+5 mentre il server rimane fermo a C.
RFC 4226 definisce che, in fase di autenticazione, il server calcola una finestra di look-ahead compresa nell'intervallo [C+1, C+s] (tipicamente s=20). Se viene riscontrata una corrispondenza, il server salta in avanti e risincronizza istantaneamente il contatore C.

⏱️ Mitigazione TOTP: Tolleranza al Time Skew (Finestra ±1)

A causa della latenza di rete o del disallineamento dell'orologio sul dispositivo client (ad esempio uno smartphone con 10 secondi di ritardo), i codici possono giungere a cavallo di intervalli temporali contigui.
I server di produzione valutano un array di 3 finestre: [T-1, T, T+1], estendendo la finestra di accettazione complessiva a 90 secondi.

Regola Obbligatoria Anti-Replay: Per impedire attacchi di tipo replay all'interno della finestra di skew di 90 secondi, i server devono memorizzare nella cache e bloccare in memoria (ad esempio tramite Redis) i token già convalidati per 90 secondi, rifiutando richieste duplicate.
🛡️ Confronto Stringhe Constant-Time (Difesa dagli Attacchi Timing):

Quando un server controlla se il codice inserito dall'utente corrisponde a quello generato internamente, i controlli di uguaglianza standard tra stringhe (come userOtp === serverOtp) si interrompono al primo carattere difforme. Un aggressore capace di misurare microscopiche variazioni nei tempi di risposta della rete può ricostruire le singole cifre iterativamente. Le infrastrutture backend enterprise implementano controlli a tempo costante (come crypto.timingSafeEqual in Node.js) per neutralizzare qualsiasi attacco basato sui canali laterali temporali.

06

Perché TOTP Ha Conquistato l'Internet Moderno

Il successo determinante di TOTP rispetto a HOTP su scala globale è riconducibile a tre ragioni architetturali imprescindibili:

☁️ Scalabilità Cloud Senza Stato (Stateless)

Nelle architetture a microservizi distribuite su più regioni, qualsiasi istanza dotata di orologio sincronizzato via NTP può convalidare token TOTP senza dover interrogare o bloccare record in un database centrale.

📱 Sinergia con l'Ecosistema Smartphone

I dispositivi mobili sincronizzano autonomamente l'orologio interno con le celle telefoniche e il GPS, azzerando le problematiche di clock drift senza richiedere manutenzione hardware dedicata.

🛡️ Finestra di Attacco Ridotta a 30 Secondi

I token HOTP restano validi a tempo indeterminato fino al loro consumo. I token TOTP decadono automaticamente dopo 30 secondi, neutralizzando file di log compromessi e catture passive dei pacchetti.

🧮 Motore RFC 6238 Puro Lato Client

Sperimenta i Calcoli TOTP in Tempo Reale su 2FA-Tool

Scopri come la tua stringa segreta Base32 si trasforma in codici dinamici a 6 cifre tramite la dynamic truncation HMAC-SHA1. 100% offline nel tuo browser.

Apri Generatore Online