
La guida completa al TOTP in squadra
Come funziona il TOTP, quali proprietà dell’algoritmo causano tutti i problemi degli account condivisi, e che cosa una squadra deve mettere in piedi.
Il TOTP prende due ingressi e produce un’uscita. Gli ingressi sono un segreto condiviso e l’ora corrente; l’uscita è un codice a sei cifre che chiunque detenga lo stesso segreto può calcolare. Non c’è alcuna chiamata di rete, alcuna registrazione per dispositivo, e alcuna traccia lato server del dispositivo che ha prodotto un codice.
Tutte le difficoltà che una squadra incontra con la 2FA su account condivisi derivano da questa frase. Questa guida spiega il meccanismo, poi ciò che implica per una squadra di più di una persona.
Che cos’è il TOTP?
Il TOTP è specificato dalla RFC 6238. È uno strato sottile sopra HOTP (RFC 4226), che produce un codice a partire da un segreto e un contatore. HOTP incrementa il contatore a ogni uso; il TOTP sostituisce il contatore con l’ora corrente divisa in passi fissi, perché i due lati arrivino allo stesso valore senza comunicare.
Come funziona il TOTP?
Una generazione somiglia a questo:
counter = floor(unix_time / period) # il periodo è in genere di 30 secondi
digest = hmac_sha1(secret, counter) # 20 byte
offset = digest[-1] & 0x0F # troncamento dinamico
number = int_from(digest[offset:offset+4]) & 0x7FFFFFFF
code = number % 10 ** digits # completato con zeri, 6 cifre in genere
Quattro parametri sono in gioco: il segreto, il periodo (30 secondi come valore predefinito), il numero di cifre (6) e l’algoritmo (SHA-1 nella pratica). L’app di autenticazione di un telefono fa esattamente quanto sopra, offline. Il server fa la stessa cosa e confronta.
Due conseguenze meritano di essere dette chiaramente, perché è lì che cominciano la maggior parte dei malintesi:
- Nulla in un codice identifica la sua fonte. Il server vede sei cifre che corrispondono, non quale dispositivo o quale persona le ha prodotte.
- Non c’è alcuno stato da revocare. Iscrivere un dispositivo non è una registrazione, è una copia del segreto. Nulla nell’account ne tiene traccia.
Il segreto è l’account
Il segreto è in genere lungo da 16 a 32 caratteri base32. Non scade, non è legato ad alcun dispositivo, e il protocollo non ha alcuna nozione della sua rotazione.
Quando scansioni un codice QR di configurazione, leggi un URI nel formato pubblicato con il nome di Key URI Format:
otpauth://totp/Acme:[email protected]?secret=JBSWY3DPEHPK3PXP&issuer=Acme&algorithm=SHA1&digits=6&period=30
Questa stringa è l’intera credenziale. Il codice QR ne è una fotografia. Il che vuol dire che uno screenshot della schermata di iscrizione non è una comodità. È il secondo fattore, in una forma che si inoltra, si salva e si indicizza.
Da qui derivano le proprietà che rendono scomoda la 2FA condivisa:
- Il possesso vale accesso permanente. Chi ha il segreto può produrre tutti i codici futuri, su qualsiasi dispositivo, per sempre.
- Le copie sono invisibili. Nessuna pagina di sicurezza ti dirà mai quante ne esistono.
- Revocare significa riprendere tutto. L’unico modo di invalidare una copia è disattivare la 2FA sull’account e riconfigurarla, per tutti.
L’iscrizione, passo per passo
Ciò che accade durante la configurazione spiega perché alcune scelte successive sono irreversibili.
- Il fornitore produce il segreto. È creato lato server, registrato sul tuo account, e non cambia più a meno che la 2FA non venga disattivata.
- Viene presentato una volta, sotto forma di codice QR e in genere sotto forma di stringa base32 dietro un link «non riesci a scansionare?». È l’unico momento in cui la credenziale viene mostrata a un umano.
- Il tuo client lo conserva. Un’app di autenticazione lo scrive sul dispositivo; una cassaforte di squadra lo scrive nel proprio archivio cifrato. Entrambe fanno la stessa cosa: tenere una copia.
- Inserisci un codice per confermare. Questo prova che la copia funziona. Non è una registrazione del dispositivo: nulla che riguardi il tuo telefono viene inviato da nessuna parte.
- Il fornitore rilascia codici di recupero, in genere in quel momento, e in genere una volta sola.
Il passaggio 2 è tutta la posta in gioco. Ciò che vede quella schermata detiene il secondo fattore dell’account da lì in avanti, e il passaggio 4 non dà alcuna indicazione su quante cose l’abbiano visto. Per questo «facciamo solo uno screenshot per ora» è una decisione senza data di scadenza, ed è per questo che la domanda giusta durante la configurazione non è chi lo scansiona, ma dove andrà a vivere l’unica copia.
Perché esiste la finestra di trenta secondi
I due lati devono accordarsi sul contatore senza parlarsi: si accordano quindi sull’ora. Un passo di trenta secondi è il compromesso: abbastanza lungo per digitare un codice, abbastanza corto perché un codice catturato non valga più nulla poco dopo.
I verificatori accettano di solito anche il passo immediatamente precedente, e a volte quello successivo, per assorbire il tempo di digitazione e i piccoli scarti d’orologio. È per questo che un codice funziona spesso ancora per qualche secondo dopo l’azzeramento del conto alla rovescia.
Vuol dire anche che gli orologi contano. Un dispositivo il cui orologio ha un minuto di scarto calcola i codici di un passo che il server ha già lasciato, e tutti i codici vengono rifiutati. Quando qualcuno segnala che i codici hanno smesso di funzionare, un orologio non sincronizzato è la prima cosa da verificare, prima di supporre che il segreto sia sbagliato. Tutto ciò che produce codici per una squadra ha bisogno di un orologio sincronizzato come requisito stretto, non come comodità.
Come funziona la verifica, e perché un codice dovrebbe servire una volta sola
Dall’altra parte, il verificatore calcola il codice atteso per il passo corrente e confronta. Tre dettagli di questo confronto contano per chi gestisce account condivisi.
La finestra di accettazione è un compromesso deliberato. Ogni passo supplementare accettato da un server allunga il tempo in cui un codice catturato resta utilizzabile. Un passo indietro è normale; finestre ampie segnalano un servizio che maschera problemi di orologio.
Un codice dovrebbe essere monouso. La RFC 6238 dice esplicitamente che una seconda autenticazione con lo stesso passo temporale dovrebbe essere rifiutata, e le buone implementazioni seguono l’ultimo passo usato per account. L’effetto pratico per una squadra: due persone che accedono negli stessi trenta secondi possono vedere il secondo tentativo rifiutato anche se il codice mostrato è corretto. Aspettare il codice successivo è il rimedio, e non è un bug.
I tentativi dovrebbero essere limitati. Sei cifre sono un milione di possibilità, il che resiste alla forza bruta solo se il server limita i tentativi. Questa protezione vive interamente lato fornitore; nulla di ciò che fai del segreto la migliora.
Nessuno di questi punti si configura dal lato di una squadra, ma tutti e tre spiegano sintomi che altrimenti somigliano a una configurazione rotta: un codice che funziona in ritardo, un codice che funziona per un collega e non per il successivo, un accesso che comincia a rifiutare codici corretti dopo una raffica di tentativi.
Il TOTP è sicuro? Contro che cosa protegge e contro che cosa no
Difende bene contro le password riutilizzate, il credential stuffing da fughe di dati, e una password trapelata isolatamente. Un attaccante che ha solo la password non può accedere.
Non difende contro un rilancio in tempo reale: una falsa pagina di accesso convincente che chiede il codice e lo trasmette nella sua finestra di validità. I codici TOTP sono soggetti a phishing per progetto, dato che l’utente può leggerli. Non fa nulla nemmeno contro un software malevolo sul dispositivo che li produce, un cookie di sessione rubato, o un segreto copiato.
Quest’ultimo punto è la falla che riguarda le squadre. Tutte le altre minacce dell’elenco sono trattate dalle impostazioni di sicurezza dell’account stesso. Un segreto copiato è trattato soltanto dal modo in cui la tua squadra lo custodisce, cosa che il fornitore non può né vedere né aiutare.
Dove le squadre rompono il TOTP
Per danno crescente:
- Una persona tiene l’app. Nessun segreto viene copiato, ma l’account dipende ormai dalla disponibilità di un essere umano.
- Un telefono dedicato in un cassetto. Ottimo in ufficio, inutile da remoto, e non registra nulla.
- Il segreto accanto alla password in una cassaforte condivisa. Pratico, e riunisce i due fattori in un solo contenitore.
- Il codice QR pubblicato in un canale. Distribuzione permanente e non contabile della credenziale.
I compromessi di ciascuno, e il modo di scegliere, sono il tema dei modi migliori per gestire la 2FA di un account condiviso e, tipo di account per tipo di account, di la 2FA di un account condiviso: come dovrebbe muoversi una squadra?.
Che cosa richiede un’installazione TOTP tagliata per una squadra
Un’installazione che sopravvive a più di una persona ha bisogno di sei cose, qualunque sia lo strumento scelto. È l’elenco da verificare prima di scegliere.
Una custodia unica del segreto. Un solo posto lo detiene, inserito una volta, dalla persona che amministra l’account. Tutto il resto consuma codici.
Una distribuzione dei codici senza distribuzione del segreto. Chi deve accedere ottiene il codice corrente e il conto alla rovescia, e non può ricostruire il segreto da ciò che vede.
Un’autorizzazione per persona e per account. Non per cassaforte. Chi pubblica sul profilo social non ha ragione di produrre codici per il fornitore di pagamenti.
Una traccia delle consultazioni dei codici. Il registro del fornitore mostrerà l’account condiviso, non la persona. Un registro di chi ha chiesto un codice è l’unica cosa che riporta un incidente a un nome e una marca temporale.
Un orologio sincronizzato ovunque vengano prodotti codici, per la ragione data sopra.
Un percorso di recupero testato. È la parte che le squadre scoprono nel momento peggiore.
Backup e recupero
Due cose distinte devono essere recuperabili, e non dovrebbero vivere né nello stesso posto l’una dell’altra, né nell’account che proteggono.
Il segreto, perché perderlo obbliga a reimpostare la 2FA dell’account. La sua posizione dovrebbe essere annotata, e raggiungibile da più di un amministratore.
I codici di recupero del fornitore, che sono ripieghi monouso rilasciati all’iscrizione. Servono per il giorno in cui il segreto è sparito, non per l’accesso quotidiano: sono in numero finito, e nessuno può dire quale sia stato consumato da chi.
Conservare l’unica copia di un codice di recupero nell’account che recupera è un anello che si chiude esattamente quando ti serve aperto. Lo stesso vale per il segreto dell’account che custodisce la cassaforte che contiene i tuoi segreti.
Il percorso di recupero merita di essere percorso una volta, deliberatamente, su un account senza posta in gioco: disattivare la 2FA con un codice di recupero, riconfigurarla, verificare che tutti quelli che hanno bisogno dei codici li abbiano ancora. Senza questa prova a vuoto, scoprirai la procedura il giorno in cui l’account è già inaccessibile.
I parametri che incontrerai davvero
I valori predefiniti coprono la stragrande maggioranza: SHA-1, sei cifre, trenta secondi. L’uso di SHA-1 qui non è la debolezza che sembra, dato che HMAC-SHA1 non è toccato dagli attacchi per collisione che hanno mandato in pensione SHA-1 per le firme. La RFC autorizza SHA-256 e SHA-512, ma il supporto da parte delle app è abbastanza disomogeneo da far sì che i fornitori li usino di rado.
Una minoranza di servizi si discosta: otto cifre, un periodo di sessanta secondi,
o un alfabeto di codice non numerico. La conseguenza pratica è un requisito di
archiviazione. Ciò che detiene un segreto deve detenere i suoi parametri digits,
period e algorithm accanto, altrimenti i codici di quegli account saranno
sbagliati in un modo che somiglia a un segreto rotto. Qualsiasi strumento che
accetti solo una stringa di segreto nuda presuppone in silenzio i valori
predefiniti.
Piccolo glossario
Vale la pena mettersi d’accordo all’interno di una squadra, perché queste parole sono usate indifferentemente e le persone finiscono per parlare di cose diverse.
- Segreto (o seed): la stringa base32 da cui vengono i codici. Permanente.
- Chiave: il più delle volte un sinonimo di segreto. A volte si indica così la Key URI, che è un’altra cosa.
- Codice (o OTP): le sei cifre. Valido un passo, monouso.
- Token: usato indifferentemente per le sei cifre e, su un hardware dedicato, per il dispositivo che detiene il segreto. Precisare quale.
- HOTP: la stessa costruzione con un contatore che si incrementa a ogni uso.
- Periodo / passo temporale: l’intervallo di validità di un codice, in genere 30 secondi.
- Deriva: lo scarto fra due orologi, che fa fallire i codici.
- Key URI / URI otpauth: la forma testuale del carico di iscrizione; il codice QR ne è la codifica visiva.
- Codici di recupero: ripieghi monouso forniti dal servizio, senza rapporto con il TOTP.
- Iscrizione: la copia del segreto su un dispositivo. Non una registrazione, malgrado l’impressione che dà.
Dove si colloca Share Auth
Share Auth mette in atto i sei requisiti qui sopra per gli account che hanno
davvero un solo identificativo. I segreti sono inseriti una volta e cifrati a
riposo, con digits, period e algorithm conservati accanto; i membri vedono
codici e conti alla rovescia invece di segreti; i permessi sono per membro; e ogni
consultazione è scritta in un registro degli accessi. Togliere un membro gli
toglie l’accesso a tutti gli account in una volta.
Non è un sostituto dell’accesso per persona sulle piattaforme che lo propongono. Dove uno strumento può dare a ogni compagno di squadra il proprio identificativo e il proprio secondo fattore, è strettamente meglio che condividere qualsiasi cosa.
Lista di controllo
- Il segreto di ogni account condiviso ha una casa nota, raggiungibile da due amministratori.
- Nessuno ha bisogno del segreto per ottenere un codice.
- L’accesso è concesso per persona, per account, e revocabile con un’azione.
- Le consultazioni dei codici sono registrate nel momento in cui avvengono.
- I codici di recupero sono conservati con il segreto, fuori dall’account che recuperano.
- Gli orologi sono sincronizzati ovunque vengano prodotti codici.
- Il percorso di recupero è stato provato una volta, apposta.
- Ogni account il cui codice QR sia stato condiviso un giorno ha visto la sua 2FA reimpostata.
Domande frequenti
TOTP, per «time-based one-time password», è l’algoritmo specificato dalla RFC 6238 che trasforma un segreto condiviso e l’ora corrente in un codice breve, sei cifre nella maggior parte dei casi, valido una trentina di secondi. L’account e l’app di autenticazione detengono lo stesso segreto: calcolano quindi lo stesso codice senza scambiarsi nulla.
OTP è la categoria generale, una password monouso. TOTP è un modo di produrne una, a partire da un segreto condiviso e dall’ora corrente. Ne esistono altri: HOTP conta gli utilizzi invece del tempo, e i codici inviati via SMS o email sono password monouso trasmesse invece che calcolate. TOTP è un tipo di OTP, non un’alternativa all’OTP.
Entrambi derivano un codice dallo stesso segreto condiviso. HOTP (RFC 4226) usa un contatore che si incrementa a ogni uso: i due lati si desincronizzano non appena uno produce codici che l’altro non vede mai. TOTP (RFC 6238) sostituisce quel contatore con l’ora corrente divisa in passi di trenta secondi, il che elimina il problema di sincronizzazione e dà ai codici una scadenza. Quasi tutte le app di autenticazione che incontrerai fanno TOTP.
Sì per ciò che è progettato a fermare: password riutilizzate, credential stuffing e database di password trapelati. Non ferma chi ritrasmette un codice da una falsa pagina di accesso convincente, in tempo reale, e non aiuta in nulla se il segreto stesso è stato copiato. Trattalo come un buon secondo fattore, non come una prova d’identità.
Sì. Qualsiasi dispositivo che detenga lo stesso segreto con un orologio giusto produce le stesse sei cifre. È per questo che il TOTP si può condividere, ed è anche per questo che condividere il segreto è definitivo: non c’è alcuna registrazione per dispositivo da revocare.
I codici vengono rifiutati. Il TOTP deriva il codice dall’ora corrente: un dispositivo o un server sfasato di più di un minuto circa produrrà i codici del passo sbagliato. Tutto ciò che produce codici per una squadra deve tenere l’orologio sincronizzato.
Non progressivamente. Il protocollo non prevede alcun meccanismo di rotazione: si disattiva la 2FA sull’account e la si riconfigura, il che invalida tutte le copie del vecchio segreto e obbliga a reiscrivere tutti quelli che hanno bisogno dei codici. È l’unica vera revoca disponibile.
La maggior parte usa SHA-1, sei cifre e un passo di trenta secondi, che sono i valori predefiniti. Una minoranza se ne discosta, con otto cifre, un periodo di sessanta secondi, cinque caratteri o un’altra funzione di hash: ciò che conserva un segreto deve quindi conservare i suoi parametri accanto, e non solo la stringa del segreto.
Da leggere anche · Come funziona TOTP
Come funzionano i segreti TOTP (e perché non vanno condivisi)
Che cos’è un segreto TOTP, i posti in cui le sue copie si accumulano in silenzio, e l’ordine esatto per reimpostare un account il cui segreto è già circolato.
Autenticazione a due fattori: definizione e funzionamento
Che cos’è l’autenticazione a due fattori, come protegge un account, quali metodi esistono e perché non tutte le forme di 2FA si equivalgono.