Le migliori password della nostra vita
State leggendo questo post, e vi state chiedendo se andare avanti: "l'ennesimo post sulle migliori password, su che struttura debbano avere per raggiungere un livello di sicurezza adeguato. Non se ne può più!".
Già m'immagino!
Già m'immagino!
Non l'avrei di certo scritto, se non avessi alcune considerazioni da fare sui meccanismi di autenticazione forte e sulle care vecchie password.
Prendiamo l'autenticazione a due fattori con token. Come spero già sappiate (ma non siete certo obbligati) si dice "a due fattori" perché il primo fattore è una cosa che si conosce (es. le credenziali), mentre il secondo è una cosa che si possiede fisicamente (per es un token OTP). In quest'ultimo caso però, dobbiamo avere fisicamente l'oggetto con noi, ed è questo il problema.
Un token (qualsiasi cosa esso sia) è una cosa troppo vincolante, poiché possiamo dimenticarcelo a casa e allora che fare? Di fatto, non potremmo accedere al servizio che richiede tale autenticazione!
Google e molti altri propongono un'autenticazione a due fattori più "furba", che utilizza magari il cellulare come token (con SMS o telefonate con codici), oppure propongono l'immissione del PIN del Token solo per alcune operazioni (di solito le banche on-line).
Prendiamo l'autenticazione a due fattori con token. Come spero già sappiate (ma non siete certo obbligati) si dice "a due fattori" perché il primo fattore è una cosa che si conosce (es. le credenziali), mentre il secondo è una cosa che si possiede fisicamente (per es un token OTP). In quest'ultimo caso però, dobbiamo avere fisicamente l'oggetto con noi, ed è questo il problema.
Un token (qualsiasi cosa esso sia) è una cosa troppo vincolante, poiché possiamo dimenticarcelo a casa e allora che fare? Di fatto, non potremmo accedere al servizio che richiede tale autenticazione!
Google e molti altri propongono un'autenticazione a due fattori più "furba", che utilizza magari il cellulare come token (con SMS o telefonate con codici), oppure propongono l'immissione del PIN del Token solo per alcune operazioni (di solito le banche on-line).
Non parliamo poi di autenticazioni a 3 fattori: "una cosa che tu sai"+"una cosa che tu hai"+"una cosa che tu sei"! L'iride, le impronte, il volto, l'orecchio e avanti con l'immaginazione per identificare un'altra parte del corpo che sia unica nelle sue caratteristiche. Di fatto però ci sono problemi di calibrazione degli strumenti di riconoscimento di tali parametri biometrici per non avere eccessivi falsi positivi o falsi negativi. Senza considerare poi che, dovendo tali sistemi verificare i parametri biometrici con quelli già memorizzati, tale autenticazione pone dei problemi di privacy per gli archivi di tali dati, che devono essere opportunamente gestiti secondo il codice di tutela della privacy.
Insomma, non solo mi devo portare dietro una smartcard, un token, il telefonino! Ma devo anche stare attento alla barba, oppure se ho la congiuntivite o le mani sudate. Un delirio insomma.
La cara vecchia password, per quanto vetusta, gode ancora di caratteristiche invidiabili: la delega, e l'usabilità.
Nel primo caso, possiamo in qualsiasi momento delegare qualcun altro ad accedere per nostro conto al servizio che ci interessa semplicemente comunicandogli la password (con ogni mezzo). Ovviamente stiamo rilassando la sicurezza generale e la stiamo affidando al nostro delegato. Quante volte lo facciamo nella vita reale? Basterà poi cambiare la password.
Nel secondo caso invece, cosa c'è di più usabile di una cosa da tenere a mente? Ci vuole solo un po' di esercizio in fondo.
Ma non è tutto ora quello che luccica: le password soffrono di un problema ben conosciuto che si chiama "Social Engineering" (SE). Qual'è il modo migliore per catturare una password? MTM? Brute Force? Attacchi del dizionario?
No.
Ce ne sono tanti di modi: osservare la nostra vittima mentre inserisce la password; fare qualche prova con il nome della moglie, del padre, della madre e relative date di nascita; provare con le domande di sicurezza (anzi direi di insicurezza); fingersi la vittima e chiamare l'helpdesk della sua compagnia telefonica; guardare quel foglietto con su scritta la password troppo complessa...TROPPO COMPLESSA!
Per questo le password non dovrebbero mai essere troppo complesse. Perché il rischio è che vengano scritte da qualche parte e allora attachi di Social Engineering potrebbero diventare una triste (per l'utente) realtà.
Come determinare la robustezza di una password
Innanzitutto la "robustezza" che possiamo calcolare è quella rispetto ad attacchi di tipo brute force. Quindi enumerazioni di tutte le possibili password. Poi con alcuni accorgimenti si può partire dai criteri di robustezza per il brute force e ovviare anche al problema degli attacchi di tipo SE. Per capire quanto è robusta una password ci sono due vie: quella semplice e quella complessa.
La considerazione semplice da fare è che se scegliamo un password lunga N caratteri in cui ogni carattere è scelto da un alfabeto di Z simboli, allora la robustezza è pari a tutte le combinazioni possibili che si è costretti a fare per indovinarla: Z^N. Che espresso in bit è pari a Log2(Z^N) = N*log2(Z).
Ovvero un attacco di tipo brute force deve enumerare tutte le stringhe binarie fino a Log2(Z^N).
Ovvero un attacco di tipo brute force deve enumerare tutte le stringhe binarie fino a Log2(Z^N).
Per la via complessa, che introduce il concetto di entropia binaria, vi rimando alla fine di questo post.
Come costruire una password
- fissate una lunghezza ragionevole: non eccessivamente lunga per le password casuali, abbastanza lunga per quelle non casuali e basate su parole appartenenti a domini "esotici". Se ricordate quanto detto prima, in fondo la robustezza è pari a Z^N, quindi se aumentate di solo un carattere la password, moltiplicate Z^N per N!
- password casuali generate con PRNG o RNG (Pseudorandom Number Generator o Random Number Generator): se hanno un alfabeto di simboli abbastanza ampio e una lunghezza ragionevole sono inattaccabili con metodi quali forza bruta, attacchi del dizionario ed altro; ma purtroppo sono difficilmente memorizzabili ed il rischio di trovarle memorizzate da qualche parte è molto alto. Quindi soggette ad attacchi di tipo SE.
- password non casuali: (tra cui le passphrase) sono composte da parole di senso compiuto che possono creare delle frasi e quindi di facile memorizzazione. Alcune considerazioni che riguardano queste password però sono doverose:
- se sostituite ad alcune lettere (non a tutte!) i numeri o le maiuscole, questo aumenta la forza della password solo per attacchi a forza bruta, perché invece attacchi del dizionario sono possibili con strategie adeguate (ogni volta che trovi una lettera, prova a sostituire con il numero equivalente se esiste, etc.)
- potete separare le parole con degli spazi che aumentano la memorizzabilità (sempre che il sistema accetti degli spazi)
- fissate un numero esatto di numeri o maiuscole da inserire: eviterà l'inserimento di password con tutti numeri, o tutte lettere maiuscole
- evitate di mettere tutti i numeri all'inizio o alla fine della password
- scegliete un dominio delle parole insolito: se è meno conosciuto e meno probabile che vi sia un dizionario già pronto
- i segni di interpunzione servono solo per ampliare l'alfabeto ma sono terribilmente complicati da ricordare. Se fossi in voi li userei solo in casi eccezionali e in posizioni ben identificate
- non prendete una frase di un libro perché con un po' di SE e Google basta inserire l'incipit ed avete subito il resto; potete però cambiare la frase con qualche trucco che solo voi sapete
- evitate delle password imbarazzanti o che rivelano vostre informazioni riservate: se la password rimane nascosta non è un problema, ma nel caso dobbiate rivelarla a qualcuno per motivi di urgenza, vi trovereste in imbarazzo
- non vi complicate la vita: relazionate la forma della password al rischio di compromissione della stessa; non avete bisogno di una password eccessivamente robusta per l'iscrizione con falso nome sul forum di giochi on-line!
- cambio della password: cambiatela, ma non così spesso, alla fine rischiereste di usare le 3-4 password che usate di solito!
- usate un password wallet elettronico: scegliete una master password abbastanza robusta ed un programma open source di cui sia possibile ispezionare il codice
Approfondimento "entropico"
Proverò ad essere estremamente discorsivo, ma qualche concetto di Teoria dell'Informazione è inevitabile (e anche interessante no?).
Scegliamo una password di lunghezza N, in cui ogni carattere è scelto da un alfabeto A, dove |A| = Z è la cardinalità di A (gli elementi che ci sono in A).
Sia PWD = C1 C2 C3....Cn. L'entropia binaria della password (ovvero, con molte semplificazioni, la sua robustezza) è quindi la seguente:
Sia PWD = C1 C2 C3....Cn. L'entropia binaria della password (ovvero, con molte semplificazioni, la sua robustezza) è quindi la seguente:
[1] H(password) = H(C1,C2,..,Cn) = H(C1)+H(C2)+H(C3)+...+H(Cn)
(l'ultima uguaglianza vale perché le probabilità con cui compaiono i caratteri nella password sono indipendenti)
Dove H(Ci) è l'entropia del carattere i-esimo nella password, che è a sua volta l'entropia del singolo carattere Ci nell'alfabeto di appartenenza A. Quindi:
[2] H(Ci) = Somm 1..Z P(Ci)*I(ci) = Somm 1..Z P(Ci)*log2(1/P(Ci)) = Somm 1..Z P(Ci)*-log2(Pci) = - Somm 1..Z P(Ci)*log2(Pci)
H(Ci) quindi costituisce il numero "medio" di bit necessari per rappresentare un qualsiasi carattere dell'alfabeto A scelto.
I(Ci) = log2(1/P(Ci)) = -log2(P(Ci)) è invece il contenuto informativo del carattere Ci, ovvero il numero di bit necessari per rappresentare la probabilità di accadimento dello stesso Ci: più è alta la probabilità, più basso è il contenuto informativo collegato al fatto che quell'evento si è verificato.
Se la distribuzione di probabilità dei caratteri nell'alfabeto è equiprobabile (ovvero P(Ci) = 1/|A| = 1/Z per ogni i, perché ogni carattere ha la stessa probabilità di comparire) e indipendente (P(Ci) non dipende da P(Cj) per i diverso da j) allora:
[3] H(Ci) = -Somm 1..Z 1/Z*log2(1/Z) = Somm 1..Z 1/Z*log2(Z) = (1/Z+1/Z...+1/Z)*log2(Z) = log2(Z)
Quindi H(Ci) = log2(Z), ossia l'entropia binaria media di un carattere dell'alfabeto è pari al logaritmo in base 2 della cardinalità dell'alfabeto.
Abbiamo fatto un giro molto lungo ma alla fine siamo arrivati ad una conclusione intuitiva: per rappresentare |A| = Z caratteri diversi servono esattamente log2(Z) bit. Ovvero dobbiamo enumerare tutte le stringhe binarie lunghe log2(Z) bit. E' quello che si fa nel brute force, no?
Per cui ritornando a (1):
[4] H(password) = log2(Z) + log2(Z) +...+log2(Z) = N*log2(Z)
ovvero per rappresentare una password di N caratteri scelti tra Z, servono esattamente N moltiplicato il numero dei bit necessario per ogni carattere. Questa misura indica di fatto la robustezza della password perché, banalmente, per portare un attacco a forza bruta basterebbe "contare" tutte le stringhe da N*log2(Z) bit (ovvero log2(Z^N). Più è alta quest'ultima, più la password è robusta. E guarda caso il risultato è lo stesso che con il calcolo delle combinazioni!
[4] H(password) = log2(Z) + log2(Z) +...+log2(Z) = N*log2(Z)
ovvero per rappresentare una password di N caratteri scelti tra Z, servono esattamente N moltiplicato il numero dei bit necessario per ogni carattere. Questa misura indica di fatto la robustezza della password perché, banalmente, per portare un attacco a forza bruta basterebbe "contare" tutte le stringhe da N*log2(Z) bit (ovvero log2(Z^N). Più è alta quest'ultima, più la password è robusta. E guarda caso il risultato è lo stesso che con il calcolo delle combinazioni!
Dopo la teoria (i matematici inorridirebbero per questa mia affermazione), passiamo ad un esempio pratico:
Sia dato l'alfabeto A={0,1,2,3,4,5,6,7} dove |A|=Z=8, allora la probabilità P(Ci) = log2(Z) = log2(8) = 3. Sono quindi mediamente necessari 3 bit per rappresentare qualsiasi numero da 0 a 7.
Se la nostra password è lunga N = 8 caratteri, allora serviranno esattamente N*log2(Z) = 8*log2(8) = 8*3=24 bit per rappresentarla. Nel caso peggiore, dovremo enumerare tutte le stringhe da 24 bit.
Semplice no?
Se la nostra password è lunga N = 8 caratteri, allora serviranno esattamente N*log2(Z) = 8*log2(8) = 8*3=24 bit per rappresentarla. Nel caso peggiore, dovremo enumerare tutte le stringhe da 24 bit.
Semplice no?
Commenti
Posta un commento