francescomargiotta.com
  • Sicurezza

Entropia delle password: perché le regole di complessità falliscono

L'entropia misura il processo che genera la password, non la stringa che stai guardando. Con i numeri alla mano: quanto vale un bit, perché «una maiuscola e un simbolo» peggiora le cose, e cosa funziona davvero.

di Francesco Margiotta Casaluci6 min di lettura

«Almeno otto caratteri, con una maiuscola, un numero e un carattere speciale.» È la regola più diffusa al mondo, ed è anche una delle meno efficaci: produce password difficili da ricordare per le persone e facili da indovinare per le macchine. Il motivo sta in un concetto che quella regola non riesce a catturare, l'entropia.

Questo articolo spiega cos'è davvero l'entropia di una password, perché non è una proprietà della stringa che state guardando, e cosa dicono i numeri quando si smette di ragionare per intuizione.

L'entropia misura il processo, non la stringa

È il punto che ribalta tutto il resto. L'entropia non si può calcolare guardando una password: si calcola conoscendo il procedimento che l'ha generata. Due password identiche possono avere entropia completamente diversa a seconda di come sono nate.

Prendiamo la stringa Tramonto7!. Se l'ha prodotta un generatore casuale su un alfabeto di 95 caratteri stampabili, vale dieci caratteri per 6,57 bit ciascuno, cioè circa 66 bit. Se invece l'ha scelta una persona partendo da una parola comune, mettendo la maiuscola all'inizio perché lo chiede il form, aggiungendo una cifra e un punto esclamativo in fondo perché lo chiede il form, allora lo spazio reale da esplorare non è 95^10: è «parola italiana comune, capitalizzata, più una cifra, più un simbolo». Un attaccante che conosce questo schema — e lo conosce, perché è lo schema che segue quasi tutti — lavora su qualche decina di milioni di combinazioni. Ore, non ere geologiche.

La formula

Per una password generata scegliendo ogni carattere in modo indipendente e uniforme da un alfabeto di N simboli, per L caratteri, l'entropia in bit è:

H = L × log₂(N)

N = 26   (solo minuscole)          → 4,70 bit per carattere
N = 52   (maiuscole + minuscole)   → 5,70 bit per carattere
N = 62   (alfanumerico)            → 5,95 bit per carattere
N = 95   (ASCII stampabile)        → 6,57 bit per carattere

Ogni bit di entropia raddoppia il lavoro di chi attacca. Dieci bit in più significano mille volte più tentativi; venti bit in più, un milione di volte. È il motivo per cui allungare una password rende molto più che arricchirne l'alfabeto: la lunghezza moltiplica, l'alfabeto no.

LunghezzaSolo minuscoleAlfanumericoASCII stampabile
8 caratteri37,6 bit47,6 bit52,6 bit
12 caratteri56,4 bit71,5 bit78,8 bit
16 caratteri75,2 bit95,3 bit105,1 bit
20 caratteri94,0 bit119,1 bit131,4 bit
Entropia di password generate casualmente. Confrontate le colonne per riga e le righe per colonna: passare da 8 a 16 caratteri guadagna più che passare da minuscole ad ASCII completo.

Quanto vale un bit, in tempo

I bit diventano concreti quando si moltiplicano per la velocità di un attacco. La velocità dipende quasi interamente da una scelta che l'utente non controlla: la funzione con cui il servizio ha salvato la password. Con MD5 una scheda grafica moderna prova nell'ordine di cento miliardi di combinazioni al secondo; con bcrypt a costo 12, poche decine di migliaia.

EntropiaSe l'hash è MD5Se l'hash è bcrypt (costo 12)
37,6 bit (8 minuscole)circa 1 secondocirca 4 mesi
52,6 bit (8 ASCII)circa 9 orecirca 10.000 anni
71,5 bit (12 alfanumerici)circa 500 annioltre l'età dell'universo
78,8 bit (12 ASCII)circa 83.000 annioltre l'età dell'universo
Tempo medio per indovinare (metà dello spazio di ricerca), a 10¹¹ tentativi al secondo per MD5 e 10⁴ per bcrypt.

Perché le regole di composizione falliscono

Obbligare a inserire una maiuscola, una cifra e un simbolo sembra aumentare l'alfabeto disponibile, e in teoria lo fa. In pratica riduce l'entropia reale, perché le persone soddisfano il vincolo tutte nello stesso modo.

  • La maiuscola va all'inizio. Quasi sempre.
  • La cifra va alla fine, ed è quasi sempre 1, oppure un anno recente, oppure la data di nascita.
  • Il simbolo va dopo la cifra, ed è ! nella grande maggioranza dei casi.
  • Le sostituzioni «furbe» — a→@, e→3, o→0, s→$ — sono nei dizionari di attacco da vent'anni: sono una trasformazione a costo zero per chi attacca.

Il risultato è che un vincolo pensato per allargare lo spazio di ricerca finisce per concentrarlo. Un attaccante non prova tutte le combinazioni possibili: prova prima quelle probabili, e le regole di composizione gli dicono esattamente quali sono. A questo si aggiunge il danno collaterale: password più difficili da ricordare spingono al riuso tra servizi, che è il vero moltiplicatore di rischio, perché una singola violazione altrove diventa l'accesso a tutto il resto.

Le passphrase

L'alternativa è cambiare unità: invece di caratteri casuali, parole casuali. Con una lista di 7.776 parole — la dimensione classica del metodo diceware, cinque lanci di un dado a sei facce per parola — ogni parola vale log₂(7776), cioè 12,92 bit.

ParoleEntropiaConfrontabile con
4 parole51,7 bit8 caratteri ASCII casuali
5 parole64,6 bitcirca 11 caratteri alfanumerici
6 parole77,5 bitcirca 12 caratteri ASCII casuali
7 parole90,5 bitcirca 14 caratteri ASCII casuali

Sei parole casuali danno 77,5 bit e si ricordano visivamente; dodici caratteri ASCII casuali danno 78,8 bit e non si ricordano affatto. Il vincolo, di nuovo, è che le parole siano scelte a caso da una lista: una frase che ha senso, presa da una canzone o inventata da voi, non è una passphrase — è una frase, e le frasi sono nei dizionari.

Cosa dicono le linee guida moderne

Le raccomandazioni ufficiali si sono mosse nella stessa direzione. Le linee guida NIST sull'identità digitale, riviste proprio su questo punto, hanno abbandonato l'impostazione tradizionale:

  • Niente regole di composizione obbligatorie: non imponete maiuscole, cifre o simboli.
  • Niente scadenza periodica arbitraria: cambiare password ogni novanta giorni peggiora le scelte degli utenti, che finiscono per incrementare un contatore. Si cambia quando c'è un sospetto di compromissione.
  • Lunghezza minima ragionevole e massima generosa: almeno otto caratteri, meglio quindici, e accettatene almeno sessantaquattro.
  • Accettate tutti i caratteri, spazi ed emoji compresi. Ogni carattere vietato è entropia regalata all'attaccante.
  • Confrontate le nuove password con le liste di password già compromesse: è il controllo con il miglior rapporto tra efficacia e costo.
  • Non usate le domande di sicurezza. Le risposte sono spesso pubbliche sui social.

In pratica

Per chi usa le password: usate un gestore di password e lasciate che generi lui stringhe casuali lunghe, diverse per ogni servizio. L'unica password che dovete ricordare è quella del gestore, e quella conviene che sia una passphrase da sei o sette parole casuali. Attivate l'autenticazione a due fattori dove è disponibile: aggiunge un fattore che non si può indovinare a partire dal database rubato di qualcun altro.

Per chi le password le custodisce: usate una funzione di hash pensata per essere lenta — Argon2id, scrypt o bcrypt — con un salt casuale per utente, e tarate il costo sull'hardware attuale. Non inventate nulla in casa. E quando raccogliete una password nuova, controllatela contro le liste di credenziali già violate invece di chiedere un simbolo in più: il primo controllo blocca attacchi reali, il secondo produce solo password che finiscono su un post-it.

L'autore

Francesco Margiotta Casaluci è backend engineer: progetta e sviluppa microservizi in Java e Spring Boot, pipeline dati e piattaforme cloud-native. Scrive di quello che implementa, e implementa gli strumenti gratuiti pubblicati su questo sito.

Leggi il profilo completo

Articoli correlati