Se ti sei mai chiesto cosa siano davvero quei codici a 6 cifre che ruotano nella tua app di autenticazione - e perché qualche token hardware si comporti diversamente - la risposta si riduce a due standard strettamente collegati: TOTP e HOTP.
Sei alle prime armi con la 2FA in generale? Parti da cos'è la 2FA e come protegge i tuoi account.
Risposta breve
TOTP è basato sul tempo: il codice è derivato dall'ora attuale e ruota (e scade) ogni 30 secondi. HOTP è basato su un contatore: il codice è derivato da un contatore che si incrementa ogni volta che un codice viene usato, e resta valido finché non viene usato. Entrambi sono standard OATH/IETF costruiti su HMAC. La tua app di autenticazione usa quasi certamente TOTP - è ciò che implementano Google Authenticator, Authy, Aegis, Bitwarden Authenticator e la maggior parte dei siti. HOTP compare soprattutto su certi token hardware.
HOTP: basato su un contatore (RFC 4226)
HOTP - HMAC-based One-Time Password - è l'algoritmo OATH originale, definito nella RFC 4226 (2005). Ogni codice è calcolato da due elementi:
- Un segreto condiviso (un seed fornito una volta, di solito tramite un QR code)
- Un contatore che parte da zero e si incrementa di uno ogni volta che un codice viene consumato
Il dispositivo esegue HMAC-SHA1 (l'impostazione predefinita) sul segreto e sul contatore, poi tronca il risultato in un breve codice numerico - 6 cifre per impostazione predefinita, 8 opzionali.
La proprietà che definisce HOTP è che il codice non ha scadenza. Resta valido fino all'uso effettivo; il contatore avanza solo quando un codice viene accettato. È comodo quando non c'è un orologio affidabile, ma ha un difetto ben noto: la desincronizzazione. Se i codici vengono generati sul client senza essere inviati (qualcuno continua a premere il pulsante di un token), il contatore del client si porta avanti rispetto a quello del server e i due smettono di corrispondere. Per recuperare, i server implementano una finestra di look-ahead - provano i successivi valori del contatore, e se uno di essi corrisponde, avanzano il proprio contatore per risincronizzarsi.
TOTP: basato sul tempo (RFC 6238)
TOTP - Time-based One-Time Password - è definito nella RFC 6238 (2011) e si comprende al meglio come un caso particolare di HOTP. Invece di un contatore di eventi, TOTP usa il tempo attuale diviso per un passo temporale (il passo predefinito è di 30 secondi) come contatore. Inserisci quel contatore derivato dal tempo nella stessa costruzione HMAC e ottieni un codice che cambia automaticamente ogni 30 secondi e scade quando la finestra si ribalta.
Poiché il contatore è l'orologio e non le tue azioni, TOTP non si desincronizza mai a causa di codici non usati - non esiste il problema del tipo "ho premuto il pulsante troppe volte". Il compromesso è che richiede che gli orologi del client e del server siano più o meno sincronizzati. I server assorbono una lieve deriva con una piccola finestra di tolleranza, accettando tipicamente il passo temporale precedente e quello successivo oltre a quello attuale.
Tutto il resto ricalca HOTP: HMAC-SHA1 per impostazione predefinita (sono ammessi anche SHA-256 o SHA-512), 6 cifre per impostazione predefinita (8 opzionali) e il segreto fornito tramite un URI otpauth:// dentro un QR code. Se vuoi confrontare le app che generano questi codici, vedi il nostro confronto delle migliori app di autenticazione.
Tabella comparativa
| Proprietà | HOTP (RFC 4226) | TOTP (RFC 6238) |
|---|---|---|
| Fattore mobile | Contatore (basato su evento) | Tempo (ora attuale / passo) |
| Il codice scade? | No - valido fino all'uso | Sì - ogni ~30 secondi |
| Passo temporale predefinito | Non applicabile | 30 secondi |
| Difetto principale | Desync del contatore (risync look-ahead) | Deriva dell'orologio (finestra di tolleranza) |
| Algoritmo | HMAC-SHA1 (SHA-256/512 opzionale) | HMAC-SHA1 (SHA-256/512 opzionale) |
| Cifre | 6 predefinite (8 opzionali) | 6 predefinite (8 opzionali) |
| Serve la rete? | No | No |
| Uso tipico | Alcuni token hardware, offline/senza orologio | App di autenticazione, la maggior parte dei siti |
Quale usa la tua 2FA
In pratica scegli raramente - decide il servizio. E il servizio sceglie quasi sempre TOTP. Il codice a 6 cifre rotante in Google Authenticator, Authy, Aegis, Bitwarden Authenticator o Microsoft Authenticator è TOTP. Così come il codice su praticamente ogni schermata di configurazione 2FA del tipo "scansiona questo QR code" che incontri sul web.
HOTP è l'eccezione. Lo incontrerai soprattutto sui token hardware - una YubiKey può per esempio essere configurata per OATH-HOTP - o in ambienti in cui non si può garantire una sincronizzazione dell'ora affidabile, cioè esattamente lo scenario in cui un contatore batte un orologio. Una YubiKey sa in effetti fare diverse di queste cose: OATH-TOTP, OATH-HOTP e il ben più robusto FIDO2. Se vuoi il quadro completo, vedi la nostra guida completa a YubiKey e FIDO2.
Sicurezza: quale è più sicuro
TOTP è generalmente preferito per un motivo concreto: i suoi codici scadono. Un codice TOTP catturato da un attaccante è utile solo per i secondi che restano prima che la finestra si ribalti, il che mantiene breve la finestra di intercettazione-e-riutilizzo. Un codice HOTP, invece, resta valido fino all'uso, quindi un codice HOTP intercettato ma non usato dà all'attaccante una finestra di riutilizzo più lunga.
Ma nessuno dei due algoritmi è una bacchetta magica. Sia TOTP sia HOTP sono soggetti a phishing. Se una pagina di accesso falsa ti induce a digitare un codice valido, un attaccante può inoltrare quel codice al servizio reale in tempo reale prima che scada. La scadenza di TOTP accorcia quella finestra ma non la chiude. È il limite strutturale di tutti gli schemi OTP a segreto condiviso.
Gli unici fattori ampiamente diffusi realmente resistenti al phishing sono FIDO2 e le passkey, perché legano l'autenticazione all'origine del sito reale: una credenziale inoltrata semplicemente non funziona sul dominio dell'attaccante. Se vuoi salire nella scala della sicurezza, leggi cos'è una passkey.
In conclusione
TOTP e HOTP sono la stessa meccanica HMAC con un fattore mobile diverso: HOTP conta gli eventi, TOTP conta il tempo. I codici di HOTP non scadono mai ma il suo contatore può desincronizzarsi; i codici di TOTP scadono ogni 30 secondi ma il suo orologio deve restare più o meno allineato. Il mondo ha optato per TOTP nella 2FA basata su app perché codici che scadono sono l'impostazione predefinita più sicura, e HOTP sopravvive soprattutto sui token hardware e negli scenari offline. Qualunque sia quello che un servizio ti consegna, ricorda il limite comune: entrambi possono essere colpiti dal phishing. Per gli account che contano di più, una chiave FIDO2 o una passkey resistenti al phishing sono lo strato più solido.
Per definizioni in linguaggio chiaro di TOTP, HOTP, 2FA, passkey e chiave hardware, vedi il glossario di autenticazione di PwdFortress.
PwdFortress spiega gli standard di autenticazione a partire dagli RFC pubblicati e dalla documentazione pubblica. Non inventiamo risultati di test né statistiche.
★ Audit Cure53 2024 · ✓ Plan gratuit · Cross-platform
Un gestore con 2FA e passkey integrate → NordPassSalva TOTP e passkey · XChaCha20 · piano gratuito→Domande frequenti
Qual è la differenza tra TOTP e HOTP?
Entrambi sono standard OATH/IETF di password usa e getta costruiti su HMAC. **HOTP** (RFC 4226) deriva ogni codice da un segreto condiviso più un **contatore** che si incrementa ogni volta che un codice viene usato - il codice resta valido finché non viene usato, senza limite di tempo. **TOTP** (RFC 6238) è HOTP in cui il contatore è il **tempo attuale diviso per un passo temporale** (30 secondi per impostazione predefinita), quindi il codice cambia e scade ogni 30 secondi. In breve: HOTP = basato su evento/contatore, TOTP = basato sul tempo.
Quale usa la mia app di autenticazione, TOTP o HOTP?
Quasi certamente **TOTP**. Google Authenticator, Authy, Aegis, Bitwarden Authenticator, Microsoft Authenticator e la stragrande maggioranza dei siti usano TOTP - il codice a 6 cifre che cambia ogni 30 secondi. HOTP è molto più raro; lo si vede soprattutto su alcuni token hardware (per esempio una YubiKey configurata per OATH-HOTP) o in contesti in cui non è disponibile una sincronizzazione dell'ora affidabile.
È più sicuro TOTP o HOTP?
TOTP è generalmente preferito perché i suoi codici **scadono dopo circa 30 secondi**, riducendo la finestra in cui un codice intercettato può essere riutilizzato. I codici HOTP restano validi finché non vengono usati, quindi un codice intercettato ma non usato ha una finestra di riutilizzo più lunga. Detto questo, **entrambi sono soggetti a phishing** - un attaccante può indurti a inserire un codice valido su un sito falso e inoltrarlo in tempo reale. Solo FIDO2/passkey resistono al phishing.
Perché HOTP si desincronizza?
HOTP si basa su un contatore che il client e il server incrementano ciascuno. Se generi codici sul client senza mai inviarli (per esempio premendo ripetutamente il pulsante di un token hardware), il contatore del client si porta avanti rispetto a quello del server e i codici smettono di corrispondere. Per recuperare, i server usano una **finestra di look-ahead**: provano i successivi valori del contatore, e se uno corrisponde si risincronizzano. TOTP evita tutto ciò perché il contatore è l'orologio, non le tue azioni.
TOTP ha bisogno di una connessione a internet?
No. Un codice TOTP è calcolato localmente a partire dal segreto condiviso e dall'ora attuale, quindi la generazione funziona completamente offline. Richiede però che gli orologi del client e del server siano più o meno sincronizzati; i server accettano di solito una piccola finestra di tolleranza (spesso più o meno un passo temporale) per assorbire una lieve deriva dell'orologio.
Come viene condiviso il segreto OTP all'inizio?
Durante la configurazione il servizio mostra un QR code che codifica un URI `otpauth://` contenente il segreto condiviso, l'algoritmo (HMAC-SHA1 per impostazione predefinita, a volte SHA-256/512), il numero di cifre (6 per impostazione predefinita, a volte 8) e il tipo (`totp` o `hotp`). La tua app di autenticazione lo scansiona e memorizza il segreto. Da quel momento entrambe le parti calcolano lo stesso HMAC e confrontano il codice risultante.


