È tutta questione di rottura (della password)
Alzi la mano chi di voi si è trovato almeno una volta ad essere scocciato da qualche regola sulla scelta della password! Bene, una mano alzata per una persona, quindi direi che ci siamo passati tutti! Stai tranquillo, non ti voglio annoiare con delle stupide regole su come scegliere una password sicura (come puoi fare da solo leggendo qui, qui o ancora qui) ma piuttosto sul perché dobbiamo accettare e sopportare controlli di questo tipo.
Test d’ingresso
Fermo un secondo! Se stai utilizzando una di queste chiavi per proteggere qualcosa di importante, ti conviene iniziare a vendere tutti i tuoi apparecchi elettronici e cercare un eremo sperduto chissà dove.
Hai superato la prova? Bene! Eppure non era così scontato. Infatti, nonostante i ripetuti avvertimenti, la maggior parte degli utenti tende ad utilizzare password insicure, o ancora più comunemente ad utilizzare la stessa password su diversi siti internet.
Iniziamo dalle basi…
Immagina di dover proteggere qualche informazione riservata, come le foto di sabato scorso (sì, c’ero anch’io. e ho visto tutto), probabilmente vorresti che nessun altro a parte te potesse avere accesso al tuo tesssoro. E per questo motivo, è necessario poter verificare la tua identità.
Ciò può avvenire in tre modi:
- Verificando ciò che sei (impronte digitali, iride , DNA…)
- Verificando ciò che hai (cellulare, badge personale…)
- Verificando ciò che sai (ecco qui la nostra amata password)
Agli albori dell’informatica, quando ancora era necessario risparmiare anche un solo bit di informazione (un mondo lontano, oscuro e senza selfie), la password era il metodo più semplice e conveniente per verificare l’identità di una persona.
Oggi però non è più così. Con la quantità di mezzi che abbiamo a disposizione, le altre tipologie di autenticazione sono diventate disponibili a tutti, mentre le password rischiano ormai di essere una non-protezione per i nostri tesori.
Sei un duro!
Pensavo che nessuno sarebbe arrivato fin qui. E invece eccoti, pronto a iniziare la parte succosa di questo articolo.
Per scoprire perché le password non sono sicure, ci conviene mettere le mani in pasta e iniziare a scoprire come puoi accedere alle mail del tizio alla tua destra.
Il metodo più semplice, che sicuramente hai tentato sul vecchio lucchetto della bicicletta, è il metodo forza bruta. Qui sotto, puoi vedere l’hacker esperto che in questo momento sta tentando di accedere alla tua posta elettronica. O forse no.
L’attacco forza bruta consiste nel tentare tutte le possibili combinazioni, una dopo l’altra, al fine di scoprire quella giusta; può sembrare una strategia banale, ma che consente di trovare sicuramente la soluzione. Vediamo a quale costo.
Il mio vecchio amato lucchetto della bici è protetto da tre rotelline contenenti le 10 cifre arabe; per essere sicuri di azzeccare la sequenza corretta dovremo fare 1000 tentativi.
Più genericamente, il costo massimo di un attacco di forza bruta per una password di k caratteri è pari al numero delle disposizioni con ripetizione ottenibile con i simboli dell’alfabeto scelto:
Da questa equazione possiamo ricavare le due regole principali, che la maggior parte dei sistemi informatici ci richiedono:- Al crescere della lunghezza della password, il numero di tentativi cresce esponenzialmente; quindi viene spesso imposta una lunghezza minima che è sempre meglio superare
- Al crescere dell’alfabeto a disposizione il numero di tentativi cresce, quindi si chiede di allargare l’alfabeto, ad esempio utilizzando lettere minuscole, maiuscole e cifre.
Per semplicità, è conveniente ignorare i problemi dovuti al non conoscere la lunghezza della password. Da quanto detto in precedenza, per indovinare una password di 8 lettere minuscole (come “password”), serve un numero massimo di tentativi pari a:
268=2088270645762.11011
Anche se il numero potrebbe sembrare molto grande, con un attacco semplice come il brute force è possibile scoprire una password di questo tipo nel giro di qualche ora.
Ad esempio, utilizzando il mio pc e questo script Go (sicuramente non il migliore possibile) che simula un attacco, la chiave “password” è stata trovata in 8479 secondi (circa 2 ore e 30), necessari ad eseguire 29.523.720.008 iterazioni; tornando al nostro numero massimo, per verificare tutte le sequenze di caratteri possibili sarebbero sufficienti circa 16 ore. Considerate poi che il test non è avvenuto in condizioni ottimali: parallelizzando il calcolo (quindi calcolando più password nello stesso momento, sfruttando i core del processore) e utilizzando una comunissima GPU (Graphics Processing Unit, cioè il microprocessore dedicato al rendering delle immagini grafiche) sarebbe possibile migliorare ulteriormente questo risultato.
package main import ( "bytes" "fmt" "time" ) func main() { alphabet := []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"} password := "password" counter := make([]int, len(password), len(password)) iterations := 0 start := time.Now() found := false last := false stop := false for !found && !stop { stop = last iterations = iterations + 1 if (iterations % 10000 == 0) { fmt.Println("iteration:", iterations) } var buffer bytes.Buffer for x := 0; x < len(password); x++ { symbol := counter[x] buffer.WriteString(alphabet[symbol]) } test := buffer.String() // fmt.Println("testing:", test) if test == password { found = true fmt.Println("FOUND!!! password:", test) } increase(0, counter, len(password), len(alphabet)) last = lastIteration(len(password), counter, len(alphabet)) } end := time.Now() fmt.Println("started:", start.Format("2006-01-02 15:04:05")) fmt.Println("ended:", end.Format("2006-01-02 15:04:05")) var duration = end.Sub(start) fmt.Println("seconds:", duration.Seconds()) fmt.Println("number of iterations:", iterations) fmt.Println("password found:", found) } func increase(index int, counter []int, length int, alphalength int) { if index < length { counter[index] = counter[index] + 1 if counter[index] == alphalength { counter[index] = 0 increase(index + 1, counter, length, alphalength) } } } func lastIteration(pwdlength int, counter []int, alphalength int) bool { last := true for x := 0; x < pwdlength; x++ { last = last && counter[x] == (alphalength - 1) } return last }
Per fortuna, non è possibile utilizzare realmente questo algoritmo. Per rendere impossibile un brute force attack infatti è sufficiente bloccare temporaneamente un account dopo un numero molto basso di tentativi di accesso falliti, come fanno ad esempio molti social network o provider di posta elettronica. In questo modo, il numero di combinazioni testate in un secondo diminuisce drasticamente, aumentando di conseguenza il tempo necessario a completare il campo delle combinazioni.
Ma allora?
Nonostante quanto detto qui sopra, una password può essere individuata molto più velocemente, utilizzando tecniche più raffinate. Ad esempio, pipo provare ad utilizzare un calcolatore di forza delle password; come puoi vedere, la parola “password” viene segnalata come individuabile immediatamente.
Ciò è possibile perché un attacco di questo tipo deve sempre privilegiare le sequenze di caratteri che hanno più probabilità di avere successo. Scommetto che ci sei già arrivato! Esatto, nella prima immagine sono contenute alcune delle password che devono essere provate per prime, perché sono quelle che vengono utilizzate più di frequente.
Il motivo per cui la gente tende a scegliere delle password banali è semplice: si tende a sottovalutare il problema, ma soprattutto si cerca di trovare una password facilmente ricordabile.
L’attacco a dizionario si basa sull’utilizzo di liste contenenti parole, nomi e le loro combinazioni, che sono in numero molto minore alle combinazioni che devono essere testate con un attacco di forza bruta. Anche l’abitudine di alternare maiuscole e minuscole e di sostituire alcune lettere con dei numeri simili (ad esempio, trasformando “melodia” in “m3L0d1A”) sono inutili, perché gli attaccanti conoscono queste strategie e le rendono insignificanti, tenendole in considerazione per la realizzazione dei loro algoritmi.
Esiste inoltre la possibilità di aumentare le probabilità di successo di un attacco, studiando un bersaglio specifico per raccogliere informazioni utili al raggiungimento dello scopo. Ricordi il tizio magrolino di prima? Oltre ad essere un hacker è anche un ingegnere sociale, e ora sta spulciando il tuo account facebook per cercare di scoprire dove abiti, cosa stai studiando e il nome del tuo bel cagnolino. Tutte queste informazioni possono essere utilizzate, da sole o combinate, per restringere il campo delle possibili password.
Per questo motivo è sempre consigliabile utilizzare dei generatori di password casuali, in modo tale da rendere vano l’utilizzo di questo tipo di attacchi e di conseguenza costringere eventuali hacker a ricorrere comunque ad un attacco forza bruta.
Ti ho convinto? Bene!
Ma ti consiglio di non sentirti ancora al sicuro. Si sentono spesso notizie di furti di dati su siti internet frequentati da milioni di persone, che possono potenzialmente contenere anche informazioni sensibili. Per questo è consigliabile cambiare le password spesso e utilizzare una password diversa per ciascun sito internet.
Insomma, proteggersi dagli attacchi è una rottura, ma meglio noi che la nostra password.
EDIT - 14/11/17
Grazie alla segnalazione di Steven, ti propopiamo un'alternativa (gratuita ed in italiano) per gestire in sicurezza le tue password: vpnmentor (QUI o QUI).
Commenti