TOTP & HOTP
TOTP (Time-based One-Time Password, RFC 6238) e HOTP (HMAC-based One-Time Password, RFC 4226) sono i due RFC che ogni QR di iscrizione 2FA implementa. Lo schema URI otpauth:// codificato è lo standard de facto di Google Authenticator, universale su tutte le principali app di autenticazione.
Specifica TOTP:RFC 6238 (basato sul tempo, 2011).
Specifica HOTP:RFC 4226 (basato su contatore, 2005).
Schema URI:Google Authenticator Key URI Format, il formato su cui tutti gli autenticatori concordano.
Specifica HOTP:RFC 4226 (basato su contatore, 2005).
Schema URI:Google Authenticator Key URI Format, il formato su cui tutti gli autenticatori concordano.
Cos'è
Un QR di iscrizione 2FA è un URL nello schema otpauth:// che porta il segreto condiviso più metadati identificativi. Formato:
otpauth://TYPE/LABEL?secret=SECRET&issuer=ISSUER&algorithm=ALG&digits=N&period=SEC- TYPE,
totp(basato sul tempo) ohotp(basato su contatore). - LABEL,
Issuer:Account, codificato URL. Esempio:GitHub:alice@example.com. - secret, la chiave condivisa, codificata in Base32 (alfabeto RFC 4648 §6: A-Z, 2-7).
- issuer, il nome del servizio, mostrato nell'app di autenticazione. Ridondante con il label ma migliora l'UX su app che non analizzano il label.
- algorithm,
SHA1(predefinito),SHA256oSHA512. Tutti gli autenticatori supportano SHA1; pochi SHA256/SHA512. - digits,
6(predefinito) o8. La maggior parte delle app consumer si aspetta 6. - period, solo TOTP.
30(predefinito) o60secondi. HOTP ha invece un parametrocounter.
Vettori di test canonici
| Caso | Input | URI otpauth:// atteso |
|---|---|---|
| TOTP, minimale (SHA1, 6 cifre, 30 s) | issuer=GitHub | otpauth://totp/GitHub:alice@example.com?secret=JBSWY3DPEHPK3PXP&issuer=GitHub |
| TOTP, SHA256, 8 cifre | issuer=Corp | otpauth://totp/Corp:bob?secret=JBSWY3DPEHPK3PXP&issuer=Corp&algorithm=SHA256&digits=8 |
| HOTP, counter=0 | issuer=YubiKey | otpauth://hotp/YubiKey:carol?secret=JBSWY3DPEHPK3PXP&issuer=YubiKey&counter=0 |
| TOTP, segreto di riferimento RFC 6238 | issuer=Example | Segreto di test RFC standard (12345678901234567890). Produce TOTP 94287082 a T=59 s. |
Validatore di segreto Base32 live
Le app di autenticazione rifiutano i segreti che contengono qualcosa al di fuori dell'alfabeto Base32 (A-Z, 2-7). Di seguito è lo stesso validatore che Abundera esegue nel generatore TOTP, gira nel tuo browser.
Inserisci un segreto da validare.
Insidie comuni
- Base32 non è Base64. Base64 usa A-Z, a-z, 0-9, +, /, qualsiasi lettera minuscola o le cifre 0, 1, 8, 9 nel tuo segreto significa che ti è stata consegnata una stringa Base64 che verrà rifiutata da ogni autenticatore.
- Lunghezza del segreto. RFC 4226 §4 raccomanda almeno 128 bit (26 chars Base32) per HOTP e 160 bit (32 chars) per TOTP. I segreti sotto 80 bit (16 chars) sono tecnicamente legali ma segnalati come deboli.
- Il supporto degli algoritmi varia. Google Authenticator ignora il parametro
algorithme usa sempre SHA1. Perché SHA256/SHA512 abbia effetto, i tuoi utenti devono essere su 1Password, Authy, Bitwarden o Microsoft Authenticator. - Il supporto delle cifre varia. La maggior parte degli autenticatori ignora
digits=8e tronca silenziosamente a 6. Se gli OTP a 8 cifre contano (banca, alcune app governative), testa il tuo autenticatore target prima del lancio. - Codifica il label in URL. I caratteri speciali nell'issuer o nell'account (
:,@, spazio) devono essere percent-encodati nel label, altrimenti gli autenticatori più vecchi eliminano il label completamente. Abundera lo gestisce automaticamente. - Non riutilizzare mai i segreti. Ogni account ottiene un segreto fresco e crittograficamente casuale. Riutilizzare un segreto tra servizi significa che un compromesso su uno rompe tutti.
- Lo storage conta più del QR. Il QR è un bootstrap una tantum. L'app di autenticazione memorizza il segreto dopo la prima scansione. Se quel segreto viene poi esportato in chiaro (alcune app lo fanno), una perdita di disco = ogni 2FA compromessa.
Compatibilità delle app di autenticazione
| App | TOTP SHA1 | TOTP SHA256/512 | HOTP | 8 cifre | Note |
|---|---|---|---|---|---|
| Google Authenticator | Sì | Ignorato | Sì | Ignorato | La baseline de facto. Puntare sempre a questo per primo. |
| 1Password | Sì | Sì | Sì | Sì | Supporto RFC completo. |
| Authy | Sì | Sì | No | Sì | Ha rimosso HOTP nelle versioni recenti. |
| Bitwarden | Sì | Sì | Sì | Sì | Supporto RFC completo. |
| Microsoft Authenticator | Sì | Sì | Sì | Sì | Supporto RFC completo. |
| YubiKey Authenticator | Sì | Sì | Sì | Sì | HOTP è il modo canonico di YubiKey. |
| Duo Mobile | Sì | Ignorato | No | Ignorato | Usa il proprio flusso push; TOTP è solo fallback. |
Vedi anche
- /totp-2fa-qr-code/, il generatore TOTP con validatore Base32 inline.
- /hotp-qr-code/, variante HOTP basata su contatore.
- /standards/, torna all'indice degli standard.