Benvenuti a tutti, sono rootring e questo è il mio primo articolo in veste di ospite su questo blog quindi è di dovere un ringraziamento al boss Federico per avermi concesso uno spazio in questo promettente portale. Ma bando alle ciance e cominciamo subito.

Usiamo tutti i giorni decine di servizi il cui accesso ci è garantito da una combinazione di username e password. Mentre l’username non è un’informazione fortemente sensibile (a volte deve essere pubblico, come per i servizi mail), la password lo è sicuramente. Chiunque sia a conoscenza della nostra combinazione di username e password per un dato servizio è in grado di avere tutti i privilegi di cui godiamo noi stessi ed avere accesso a tutte le funzioni ed informazioni che sono nel servizio. Pensate che già dalla combinazione di email e password si può costruire, ad esempio, un solido furto di identità con conseguenze davvero gravi.

 Ma no, i servizi cui sono registrato sono famosi quindi hanno un’ottima sicurezza…

Sono state fatte molte ricerche sulla sicurezza delle password da cui risulta che il punto debole della catena di questo sistema di autenticazione è il lato umano.
Se un dato servizio obbliga l’utente a scegliere una password di almeno otto caratteri, è fortemente probabile che l’utente ne inserirà esattamente otto e se non ci sono restrizioni sul tipo di caratteri da usare molto probabilmente non ci saranno caratteri speciali ma solo lettere e, forse, numeri.crittografia

 Beh, otto caratteri sono pur sempre otto caratteri!

Facciamoci due conti: per ogni carattere abbiamo 26+26+10 combinazioni possibili (lettere minuscole, maiuscole e numeri), per otto caratteri esisteranno quindi 628 = 218.340.105.584.896 combinazioni possibili.

Una password come quella che abbiamo appena descritto si trova in un tempo che va dagli undici minuti alla settimana se si tratta di una parola scopribile con un attacco a dizionario mentre se si tratta di una combinazione casuale senza senso con un attacco brute-force si impiegherebbe un tempo che va dalle tre ore alle due settimane. Questo se parliamo di computer normali, come quelli che avete in casa.

Molti hackers (quelli buoni e quelli cattivi) hanno particolari configurazioni hardware che permettono di far decrescere queste tempistiche di dieci/cento volte se non di più!

O mio dio, cosa posso fare allora?

Aggiungendo i caratteri speciali abbiamo una sicurezza in più, le combinazioni per ogni carattere diventano 26+26+10+10 (10 caratteri speciali è una stima della media, non tutti i servizi li accettano tutti) quindi per otto caratteri si hanno 728 = 722.204.136.308.736 combinazioni possibili, ovvero più del triplo delle combinazioni possibili.
Aggiungendo poi un solo carattere in più, arrivando così a nove, si avranno 51.998.697.814.228.992 combinazioni possibili, ovvero 72 volte le precedenti combinazioni, con dieci caratteri 5.184 volte le precedenti combinazioni. Un buon risultato.

Tutto qui? Sono al sicuro adesso?

Bruce Force Attack

Se con i nostri otto caratteri del termine da dizionario un hacker ci avrebbe messo in media una manciata di ore (quindici ore per la password “Libr00tt” che non è propriamente una parola da dizionario, quindi più difficile da scovare), con la nostra nuova password di dieci caratteri casuali tra alfanumerici e speciali, ci metterebbe un tantino di più: 526 anni per la password “yTg|+Zh?9Q”, 25 anni per “]rVB<EsC>G”. Sempre usando un computer non specializzato, ma è comunque un risultato che lascia un bel margine di sicurezza!

Se poi volete fare un bel salto di qualità col minimo sforzo, aggiungete ancora un carattere: cinquantamila anni (si, 50,000) per “ODI4-!?ugGb”, in effetti stiamo parlando di 7211 = 269.561.249.468.963.094.528 possibili combinazioni. Ora si che mi sento al sicuro… Perlomeno da attacchi a dizionario e di tipo brute-force.

Finalmente sicuri… Anche se un po’ annoiati!

La maggior parte di voi starà pensando qualcosa tipo “Che palle, meno male che doveva essere una cosa interessante e poco teorica!”. Avete ragione, basta con la teoria e passiamo alla pratica: come posso crearmi delle buone password? Ci scriviamo un bel generatore di password casuali in python! Ho fatto due versioni del programma, una cotta e mangiata, semplice, efficace ma poco completa, una più funzionale ma più dispendiosa in termini di tempo.

La prima versione non fa altro che prendere casualmente dei caratteri dalla stringa chars (contenente lettere minuscole, maiuscole, numeri e simboli speciali). Non effettua però alcun controllo sull’input utente (se inserite una lettera e non un numero quando vi chiede la lunghezza della password il programma va in crash) e non permette di modificare dinamicamente i caratteri speciali, vi tenete quelli o ve li cambiate dal codice. È molto utile se vi servono velocemente delle password sicure.

    Versione 1:

from random import choice

chars = 'abcdefghijklmnopqrstuvwxyz' \
'ABCDEFGHIJKLMNOPQRSTUVWXYZ' \
'0123456789' \
'^!\$%&amp;/()=?{[]}+~#-_.:,;&lt;&gt;\\\|'

leng = int(raw_input("Password lenght: "))
numb = int(raw_input("Number of passwords: "))
for _ in range(numb):
    print ''.join(choice(chars) for x in range(leng))

La seconda versione è più elaborata, effettua i controlli sull’input dell’utente, stampa stringhe di avviso e consigli, è più elegante e soprattutto permette la modifica dei caratteri speciali runtime (a programma avviato) e senza toccare il codice.

    Versione 2:
Link al nopaste: http://wp.me/p1LrPo-BF
Se avete domande, anche sul codice, chiedete pure commentando l’articolo!