III.

Proteggere la propria identità

Cosa sanno i siti web di noi?

Siamo noi a detenere il controllo sulle informazioni fornite ai siti che visitiamo. Non bisogna dare ad un sito più informazioni di quante non gli servano per erogare il servizio desiderato. Se non ci si aspetta che un sito spedisca qualcosa al proprio indirizzo di casa, non è probabilmente una buona idea fornirgli il nostro indirizzo personale solo perché ce lo chiede. Lo stesso vale per i numeri di telefono, il nome completo e addirittura l'indirizzo email. Il minor numero di informazioni si danno ad un sito web, meno si ha da perdere in caso qualcuno provi a vendere l'informazione o abbia accesso al nostro conto.

Esempio

Quando avvengono delle fughe di dati, questi vengono spesso pubblicati su internet in modo che altri li possano vedere. Se si è impostato il nome da nubile della propria madre o il nome del proprio primo animale domestico come risposta ad una domanda di sicurezza, quell'informazione potrebbe essere in questo momento disponibile per chiunque sappia come usare Google. Questo tipo di domande di sicurezza sono intrinsecamente non sicure, perché il cognome da nubile di nostra madre, il nome del proprio animale domestico o il proprio primo indirizzo sono di solito davvero facili da trovare.

E che succede se l'informazione trapelata è la propria password? La stessa password viene usata anche da qualche altra parte? Se la risposta è sì, chiunque può tentare di usare la combinazione del nostro indirizzo email e password anche su altri siti. L'informazione trapelata viene spesso impiegata in altri attacchi ancor prima di venir pubblicata.

Le password sono di solito il primo ostacolo incontrato da un attacco. Nei capitoli successivi si tratterà anche di altri elementi che possono prevenire che un aggressore informatico possa accedere ai nostri account. Questo approccio di difesa in profondità è una pratica comune nell'ambito della cybersecurity. Significa adottare diversi strati di difesa di un asset che si vuole proteggere. Se un livello viene compromesso, per esempio la propria password, non significa che gli aggressori avranno libero accesso alle nostre informazioni.

Note
Frecce che tentano di attraversare multipli strati di difesa perforati
Frecce che tentano di attraversare multipli strati di difesa perforati

La difesa in profondità è un concetto impiegato nell'ambito della sicurezza informatica, per cui livelli multipli di controlli di sicurezza (difesa) vengono implementati nell'intero sistema informatico. Il suo scopo è quello di fornire ridondanza nel caso in cui un controllo di sicurezza fallisca o una vulnerabilità venga sfruttata, la quale possa adempiere a funzioni di sicurezza personale, procedurale, tecnica e fisica per la durata del ciclo del sistema.

Per gli account su internet una password rappresenta di solito il primo livello protettivo a disposizione. Approfondiremo un po' la teoria dietro il funzionamento delle password prima di cominciare a familiarizzarci con altri livelli che si possono utilizzare.

Gli attacchi di enumerazione e nomi utente

Gli enumeration attacks o attacchi di enumerazione vengono spesso impiegati dagli aggressori informatici per stabilire dei nomi utente validi come primo passo nel processo che porta all'ottenimento delle credenziali per il login di un utente. Questo tipo di attacchi avviene comunemente nell'ambito delle funzioni di login e di "password dimenticata". Per esempio un sito può inavvertitamente far trapelare informazioni sui suoi membri mostrando messaggi diversi durante un tentativo di login a seconda se il nome utente o l'email esistono o meno.

Esempio

Vi è mai capitato di digitare per errore un nome utente sbagliato e ricevere in risposta il messaggio di errore "nome utente non valido" o "il nome utente non esiste"? Se un sito prevede un messaggio simile che isola i casi in cui è solo la password ad essere sbagliata, allora un aggressore informatico può utilizzare quest'informazione per sapere cheun certo nome utente è valido. Ciò permette agli aggressori di enumerare enormi liste di indirizzi email, per esempio, e ottenere informazioni rispetto a chi ha un account sul sito preso di mira. Ecco perché è buona pratica che un sito abbia un messaggio di errore nel login che non dia ad intendere quale elemento nel tentativo di login è sbagliato, per esempio "nome utente O password non validi".

Nella maggior parte dei casi questo tipo di informazione non produce alcun danno. Tuttavia se qualcuno riuscisse a verificare l'esistenza di un account su un sito per appuntamenti o di servizi escort, quell'informazione può essere usata come un'arma contro qualcuno.

Gli attacchi di enumerazione possono anche essere impiegati per indirizzare meglio attacchi di phishing verso certe persone e vengono anche impiegati per rendere più facili gli attacchi di forza bruta riducendo il numero dei possibili target. Approfondiremo le definizioni di phishing e di metodo forza bruta in seguito.

Gli attacchi di enumerazione non si limitano alle interfacce di login. Possono applicarsi anche alle funzioni per reimpostare la password o per creare un account. Nell'ambito della creazione di un account, per esempio, non è di solito permesso creare un account doppione e all'utente che ci prova viene notificato che esiste già un account con la mail o il nome utente forniti.

Il passo successivo per ottenere i dati necessari per effettuare un login è quello di scoprire la password. Questo è il tema che approfondiremo in ciò che segue.

Le password

La maggior parte dei siti che utilizziamo ci identificano con una combinazione di username (nome utente) e password. Poiché da utenti ci troviamo ad utilizzare decine o anche centinaia di servici diversi, di solito tendiamo a creare delle password facili da ricordare. Il problema delle password facili da ricordare è che di solito sono anche facili da indovinare per potenziali aggressori informatici. Considerando il fatto che nel 2020 le password più comunemente usate erano 12345, 12345678, qwerty e password, è un gioco da ragazzi accedere ad un'enorme quantità di account con queste password in combinazione con indirizzi email a caso.

Le password più comuni del 2020

  • 123456

  • 123456789

  • qwerty

  • password

  • 1234567

  • 12345678

  • 12345

  • iloveyou

  • 111111

  • 123123

Nel passato i requisiti più comuni per la creazione di una password erano pessimi ed hanno insegnato alla gente a creare password terribili. Queste raccomandazioni non ottimali hanno fatto in modo che le password create fossero difficili da memorizzare ma facili per un computer da decifrare.

Il fumetto XKCD esprime molto bene l'essenza della sicurezza delle password.

Due chiavi di lunghezze diverse
Due chiavi di lunghezze diverse

Una buona password non deve per forza contenere simboli astrusi per essere sicura. In generale, più lunga la password, più sicura è. Quei requisiti che impongono di includere nelle password simboli, lettere minuscole e maiuscole e numeri non prendono di solito in considerazione quanto una password sia difficile da decifrare o meno. Questi requisiti rendono più ampio il keyspace (il numero di combinazioni di lettere possibili per formare una password di una certa lunghezza), ma la stessa cosa si ottiene semplicemente aumentando la lunghezza di una password.

Si consideri il seguente esempio:

Se per una password si usa il set di caratteri minuscoli dell'alfabeto inglese, ovvero 26 caratteri e la lunghezza della password è di 6 caratteri random, il keyspace si calcola:

266= 308,915,776 password possibili

Note

^ si usa spesso per esprimere “alla potenza di”, equivalente a 266. Non c'è bisogno qui di essere degli esperti di matematica, ma se si è curiosi si può digitare un equazione come 26^6 nei più comuni motori di ricerca e si otterrà il risultato

Mentre se la password è di 8 caratteri random, il keyspace sarebbe:

268= 208,827,064,576 password possibili

Come si può vedere chiaramente, il keyspace aumenta considerevolmente se la password è anche solo 2 lettere più lunga. Facciamo un altro esempio aggiungendo ulteriori caratteri, per esempio le lettere maiuscole, raddoppiando così il numero di caratteri utili per una password.

526= 19,770,609,664 password possibili

Si noterà subito che il keyspace è molto più ampio rispetto a quello da cui siamo partiti. Ma non si avvicina nemmeno un po' al keyspace di una password un po' più lunga fatta di sole lettere minuscole. Cosa succede quando aggiungiamo dei simboli, per esempio !, “, #, ¤, %, &, /, (, ) e =. Ciò significa che il numero di caratteri disponibili ora è 62.

626= 56,800,235,584 password possibili

Con l'aggiunta di 10 caratteri in più nel set di caratteri ammessi il keyspace disponibile si è quasi quadruplicato. Allo stesso tempo la password è diventata molto più difficile da ricordare. Il keyspace è comunque più piccolo rispetto all'esempio di una password con 8 caratteri.

Una password veramente random batte anche altri tipi di attacchi come ad esempio gli attacchi sulla base del dizionario. I dictionary attacks o attacchi dizionario impiegano il fatto che gli utenti cercano di creare password facili da ricordare utilizzando parole del dizionario, nomi e variazioni di essi. La seconda edizione dell'Oxford English Dictionary contiene 171.476 lemmi, quindi se si usa una password composta da una sola parola, si può pensare di star utilizzando un keyspace di 170.000. Spesso queste parole non vengono utilizzate così come sono, ma vengono modificate in modo da rimanere facili da ricordare.

Esempio

Spingendoci oltre con questo esempio, possiamo prendere in considerazione l'ampiezza del keyspace se si utilizzano solo parole standard della lingua inglese. Immaginiamo di selezionare tre parole del dizionario inglese a caso e creare una password combinandole. Il calcolo sarebbe dunque:

170,000^3 = 4.913.000.000.000.000

Una tale password sarebbe molto più facile da ricordare e dal punto di vista degli attacchi di forza bruta, anche molto più difficile da decodificare. Anche altri fattori fanno sì che il keyspace sia più ridotto di quanto si pensi. La maggior parte delle persone usa in inglese un vocabolario di circa 3.000 parole e le password scelte in questo modo riflettono questo fatto. Inoltre le persone non sono per niente brave a scegliere a caso. Ciò che si percepisce come una combinazione perfettamente casuale può essere facilmente influenzata dal contesto, dai nostri pensieri o da parole selezionate in precedenza. Se si intende usare una password composta da parole, si consiglia quindi di usare un generatore invece di affidarsi al concetto umano di casualità.

Ulteriori informazioni su questo metodo.

Una strategia diffusa per cercare di offuscare le parole del dizionario è quella di sostituire lettere con numeri o aggiungere un numero alla parola per creare una password. Purtroppo questo tipo di modifiche sono ben note e per un computer è molto facile provare tutte le variazioni più comuni. Una semplice sostituzione come rimpiazzare la lettera “o” con il numero “0” rende la password più difficile da ricordare ma aggiunge ben poco lavoro per un computer. Queste semplici sostituzioni non rendono il keyspace significativamente più ampio. Lo stesso vale per l'aggiunta di un numero o dell'anno in corso all'inizio o alla fine di una parola. I software per la decifrazione delle password e le persone che li costruiscono conoscono questi trucchetti e ne tengono conto.

Entropia

La forza di una password non viene misurata solo sulla base del numero delle soluzioni possibili. Nell'ambito della cybersecurity si usa anche il termine “entropy”, per indicare un modo di misurare la difficoltà presunta del processo di decifrazione di una password nel mondo reale. L'entropia si calcola per mezzo della funzione logaritmica “log2” del keyspace (niente paura, non c'è bisogno di calcolare nulla, ma se si vuole, si può digitare la formula nei più comuni motori di ricerca e ottenere il risultato. Per esempio si può provare a digitare “log2(26^8)” su www.google.com).

Ma cosa significa l'entropia all'atto pratico? Per mezzo del calcolo dell'entropia, la forza di una password può essere misurata sulla base della seguente griglia:

< 28 bit = molto debole; probabilmente efficace contro i membri della propria famiglia

28-35 bit = debole; probabilmente efficace contro la maggior parte delle persone, sufficiente forse come password del proprio computer desktop

36-59 bit = ragionevole; password sufficientemente sicura per l'accesso ad una rete o al portale di un'azienda

60-127 bit = forte; adatta a proteggere informazioni finanziarie

128+ bit = molto forte; spesso esageratamente

Note

Rispetto agli esempi precedentemente presi in considerazione, l'entropia di una password a 8 caratteri sarebbe:

log2(26^8) = 37.6 bit

Una password a 6 caratteri avrebbe un'entropia di:

log2(26^6) = 28.2 bit

Rispetto all'esempio riportato sopra l'entropia di 8 caratteri scelti a caso (37 bit) rientra a mala pena nella categoria ragionevole. Una password con 15 caratteri (70 bit) rientrerebbe nella categoria forte ma non in quella molto forte. La natura esponenziale di questi calcoli significa che rendere una password più lunga può influire in modo significativo sulla difficoltà di decifrarla.

Per quanto utile, l'entropia non rappresenta un parametro di misurazione completo. Una password di 8 caratteri può comunque essere considerata prevalentemente insicura. Vedremo perché nella sezione successiva.

Come vengono decifrate le password

Per capire come viene decifrata una password, bisogna prima comprendere come vengono protette.

Le password vengono di solito archiviate in un database “criptate” per mezzo di un algoritmo chiamato funzione criptografica di hash. Un hash algorithm o funzione di hash è un algoritmo ciptografico impiegato per trasformare un testo semplice in testo codificato. Funziona in una sola direzione. Un testo criptato con una funzione di hash sicura non può essere riportato allo stato originale anche se l'algoritmo è noto. Il risultato ottenuto dall'elaborazione di una password per mezzo di una funzione di hash viene chiamato hash. Un hash è una stringa di caratteri composta da lettere e numeri, che rappresenta la versione codificata del testo di input originale.

Note

Un hash non è un codice criptato in senso stretto. Un encryption o codice criptato è un processo bidirezionale che può essere invertito, mentre lo hashing è una strada a senso unico. Se la funzione di hash funziona come previsto, il valore di output non può essere invertito.

Ulteriori informazioni sul tema delle funzioni criptografiche di hash sono disponibili su Wikipedia

Si prenda in considerazione un esempio famoso di funzione di hash, attualmente considerata non sicura: l'MD5.

Utilizzando l'MD5, se si applica la funzione di hash al testo “password” si ottiene come hash di output la sequenza “5f4dcc3b5aa765d61d8327deb882cf99”.

Una piccolissima variazione nel testo originale darà origine ad un valore di hash totalmente diverso. Un hash ha anche un'altra funzione importante. Non è possibile prevedere quale sarà l'hash sulla base dell'input.

Per esempio un hash MD5 per “passwore” è “a826176c6495c5116189db91770e20ce”, il che non assomiglia affatto all'hash di “password”.

Quando un utente effettua il login, la password in chiaro che l'utente immette viene processata con una funzione di hash e l'hash che ne deriva viene confrontato con il valore di hash (versione in codice della password dell'utente) archiviata nel database. Se corrispondono all'utente viene permesso di effettuare l'accesso.

Con tutta questa protezione: password in formato di testo semplice offuscate nella forma di un codice imprevedibile attraverso un algoritmo irreversibile, com'è possibile che le password vengano decifrate? Cosa rende vulnerabili i vecchi algoritmi di hash come l'MD5?

Note

Un valore di hash (la versione in codice della password originale) può venir precomputata ed archiviata in una immensa lista di password. Questi file vengono chiamati rainbow tables o tabelle arcobaleno e sono facilmente reperibili su internet. Per esempio è facile trovare un file che contiene tutte gli hash creati dall'algoritmo MD5 per qualunque password fino a 10 caratteri di lunghezza e contenente ogni combinazione possibile di lettere minuscole e numeri (abcdefghijklmnopqrstuvwxyz0123456789).

Le tabelle arcobaleno vengono create utilizzando dizionari di password (parole del dizionario e liste di password comuni) reperiti su internet elaborati dagli algoritmi di hash. Gli hash così prodotti vengono riportati accanto agli input originali di password in formato di testo semplice e poi impiegati per accedere agli account degli utenti.

Saliera
Saliera

Salt e Hash

Significa forse che lo hashing è ormai obsoleto per la maggior parte delle password? No! La buona notizia è che i programmatori hanno sviluppato diverse tecniche intelligenti per rendere più difficile reperire l'hash di una password. Una funzione di hash viene spesso applicata molte volte per aumentare il tempo richiesto per verificare una password e quindi ritardare gli attacchi di forza bruta.

Un altro metodo impiegato dai programmatori per proteggere le password dei loro utenti è l'uso della tecnica nota come "salting". In questo caso un valore speciale chiamato “salt”, viene aggiunto al testo in chiaro dopo che l'utente digita la sua password, ma prima che venga applicato l'algoritmo di hash, per prevenire l'uso di una lista precomputata di hash (tabelle arcobaleno). Una volta applicato, il valore di salt rende le tabelle arcobaleno inutili e si tratta di un modo molto semplice per rendere questo tipo di attacchi inefficaci.

Per esempio utilizzando l'algoritmo di hash MD5 e aggiungendo il salt random “xhsr2d” al testo semplice “password”, si ottiene MD5(“xhsr2dpassword”), che equivale a “ebf20a6c99eccaefa0bf4d88a5bd3456”. Si tratta di un output totalmente diverso rispetto all'hash prodotto con MD5 per la parola "password" riportato sopra, che un hacker qualsiasi potrebbe trovare in una tabella arcobaleno su internet. Attraverso il processo di salting di una password, anche se si ha a disposizione una tabella arcobaleno con gli hash di ogni password possibile in lettere minuscole e con un massimo di 10 caratteri, non è possibile trovare l'hash corrispondente e l'uso di hash precomputati è reso ineffettivo.

All'atto pratico il salting fa sì che gli aggressori che tentano un attacco di forza bruta devono provare ogni password possibile per poter decifrare gli hash codificati in un database.

Brute forcing o l'uso della forza bruta su una password significa usare il potere di calcolo dei computer per provare uno per uno i diversi hash possibili fino a che non si trova la password con il valore di hash corrispondente. Le funzioni di hash si basano sulla difficoltà di creare due diversi messaggi che producano lo stesso valore di hash. Ciò viene chiamato collisione. Se una funzione può essere indotta a generare gli stessi valori per dati di input diversi, essa viene considerata non più funzionante.

Note

L'uso della forza brutta su una password può essere molto difficile. Con i moderni computer è possibile calcolare milioni di hash al secondo. Le schede grafiche dei computer moderni sono un tipo di hardware specializzato e sono molto efficienti nel calcolo degli hash. In alcuni casi possono arrivare fino a poter calcolare miliardi di hash al secondo.

Tuttavia una password lunga 15 caratteri in minuscolo può avere fino a 1.677.259.342.285.725.925.376 variazioni diverse, e calcolare così tanti hash alla velocità di un miliardo di hash al secondo richiederebbe 50.000 anni. Il tempo di calcolo si riduce a circa 3,5 minuti per una password con 8 caratteri.

Da utenti di un servizio di solito non c'è modo di sapere se tutte le misure preventive possibili sono state adottate dagli sviluppatori. Ciò significa che è necessario dare per scontato che tabelle arcobaleno possono venir usate per decifrare la propria password. All'atto pratico significa che bisogna dare la preferenza a password più lunghe perché esse rendono l'uso della maggior parte delle tabelle arcobaleno poco pratico. Si pensi soltanto all'esempio presentato prima: aggiungendo 7 caratteri alla propria password, si può rendere la vita di un hacker MOLTO più difficile!

Next section
IV. Come rendere le proprie password sicure