Entropia, password e passphrase
Password, croce e delizia dei meccanismi di autenticazione là fuori. Dalla robustezza di questo meccanismo, dipendete il primo bastione della sicurezza dei nostri sistemi. Ma quanto è sicura una password? Le password policy funzionano? Le password sono più o meno sicure rispetto alle passphrase?
Ho provato a giocare un po’ con l’entropia per misurare i bit necessari a memorizzare i vari pattern di stringhe rappresentanti ipotetiche password.
Mi sono detto, maggiore l’entropia, maggiore sarà bontà della password. In parole povere, sono partito dall’ipotesi che, l’entropia di una stringa sia un buon KPI per quella stringa se vista come password.
Per giocare, ho usato Ruby come al solito ed ho creato un metodo entropy che, dichiarato in questo modo alla classe String, mi permette di estendere la classe base con questo nuovo metodo.
A questo punto posso, data una stringa arbitraria, calcolare il valore dell’entropia così come definita da Shannon.
Un valore di 3.78… non male come consiglio di lettura!
Per capire come si comportano delle stringhe, generate in maniera più o meno sicura, buttiamo lì un programmino che calcola l’entropia di qualche stringa con dei pattern particolari.
Ho messo un po’ di stringhe con minuscole e numeri, minuscole maiuscole e numeri, una stringa impossibile “fT$e-‘U_78~Ol:yNp” che in realtà è un’ottima password, una stringa completamente pseudo casuale, qualche passphrase e qualche combinazione di password banali come quelle composte da MeseAnno.
Le password sono più o meno sicure rispetto alle passphrase?
Ho poi fatto lo stesso calcolo sulla versione offuscata con SHA256 delle stesse stringhe. Perché sul DB è questo il valore che va, siamo d’accordo tutti vero?
I risultati, mi hanno un po’ sorpreso. Non tanto per l’andamento, in linea con quanto mi aspettassi, quanto per lo scarto. La stringa impossibile da ricordare ha il valore più alto di entropia, mentre la stringa password e la stirnga con solo minuscole e numeri hanno un valore di entropia minore delle altre. Lo 0 della stringa fatta da una sola lettera, credo non meriti la citazione.
Mi ha un po’ sorpreso il basso scarto tra la passphrase e la stringa generata con caratteri pseudocasuali.
Questo risultato, figlio del limitato alfabeto usato per la passphrase, mi dice che in realtà la quantità di informazioni necessarie per memorizzare Gennaio2017 è quasi quella necessaria per memorizzare questo Leopardi rivisitato.
Primo risultato: vista dal punto di vista di un calcolatore, una passphrase non è molto più robusta di una password banale come Gennaio2017.
Per rendere l’entropia della nostra passphrase maggiore, ne arricchiamo l’alfabeto. Vediamo come, aggiungendo tipologie di caratteri differenti, ho un aumento della quantità di informazione necessaria per memorizzare le stringhe differenti.
Questo però vanifica l’obiettivo di avere qualcosa di semplice da memorizzare, obiettivo che fa scegliere una frase piuttosto che una parola incomprensibile con lettere e numeri.
Le nostre password, però, vengono memorizzate in forma offuscata all’interno di un database. Non useremo né MD5, né SHA1 in quanto ora entrambe vulnerabili a collisioni, ci affideremo a SHA256.
Offuschiamo le password e calcoliamone l’entropia.
Essendo parole di uno stesso alfabeto ed aventi tutte la stessa lunghezza, l’entropia è pressapoco la stessa.
Secondo risultato: quando offuschiamo una parola chiave o una frase, possiamo abbassarne il valore di entropia.
Dal punto di vista dell’attaccante
Chi vuole violare la mia password parte dal suo valore offuscato. Da questo punto di partenza, essendo le funzioni di hash ad una sola direzione, l’unico approccio possibile, oltre al social engineering o compromettere la postazione della vittima, è un attacco a forza bruta.
E qui la passphrase si rivela essere la scelta migliore. Una parola chiave con una combinazione di lettere, numeri e caratteri speciali, può essere sempre ricavata da un tool di bruteforce. Potrebbero volerci anni per arrivare alla parola corretta, ma prima o poi il caso mi porterà al tanto agoniato Gennaio2017 o Farfallina78.
Se la mia parola chiave è invece, “cantami o diva del pelide achille” o “cani mangiano dromedari verdi”, sfido qualsiasi programma automatico a prendere parole per comporre frasi di senso compiuto o meno. Neanche le più sofisticate AI.
Perché scegliere una passphrase
Al posto di una password scegliete una passphrase perché:
- ha in ogni caso un buon valore di base di entropia
- è semplice da memorizzare perché associata a nostri processi mentali
- non è ricavabile da un tool automatico di bruteforce
Se sei uno sviluppatore, quindi, battiti per togliere quei vincoli assurdi sul numero di minuscole, maiuscole, numeri, lettera e testamento. Supporta le passphrase, tanto poi nel tuo DB occuperanno sempre lo stesso numero di byte, una volta offuscate.
Enjoy it!
Vuoi aiutarmi a portare avanti il progetto Codice Insicuro con una donazione? Fantastico, allora non ti basta che premere il pulsante qui sotto.
Supporta il progetto