10 Jan 2014 8 commenti
Questa richiesta di tanto in tanto salta fuori nei vari forum tematici, con le più svariate declinazioni verbali: decodificare md5, converire md5, ma la più gettonata è decriptare md5. Onde evitare malintesi chiariamo subito un concetto: non esiste nessun sistema logico-deterministico che consente di decriptare gli hash quali, ad esempio, md5 o sha1.
Ad essere rigorosi non è neanche lessicalmente corretto parlare di decriptazione: md5 e sha1 non son sistemi di encryption (cui è possibile fare il decryption) ma sono degli algoritmi crittografici di hashing. Quindi, un algoritmo di hasing non è invertibile, ossia non è possibile risalire alla stringa originale a partire dalla stringa che viene restituita in output.
Tali algoritmi a partire da una stinga di lunghezza arbitraria (poche lettere o interi libri) restituiscono una nuova stringa univoca di lunghezza predefinita, definita digit o hash.
hash_function ( string ) = digit
Nel caso dell'md5 il digit restituito è composto da una stringa di 32 caratteri composto da lettere che vanno dalla a alla f e cifre 0-9 (comunemente detta formattazione esadecimale essendo che ci sono un totale di 16 caratteri utilizzati).
Nel caso dello sha1 il digit è composto da una stinga di 40 caratteri sempre con formattazione esadecimale.
Raimbow tables
Nonostante quanto appena detto diversi siti ripromettono di poter decriptare l'md5 o lo sha1.
In realtà siti di questo genere non eseguono un vero e proprio decrypt di un hash essendo, come già chiarito, intrinsecamente impossibile. Al contrario essi cercano di individuare la stringa originale eseguendo un controllo su tabelle costruite creando un associazione fra una serie di parole e il loro hash.
Le parole contenute in tali tabelle sono di varia natura: si parte da una gamma di parole senso compito, più molte altre parole composte variamente articolate (ad esempio "PassAdmin", "pass11", etc etc) e da queste ne vengono generate altre attraverso particolari meccanismi.
In questo caso conoscendo l'hash è possibile risalire in maniera meccanicistica alla parola solo se quest'ultima è presente in tali tabelle.
Ovviamente, una raimbow table, per quanto possa essere di grandi dimensioni, non potrà mai contenere tutte le combinazioni possibili di un hash.
Per comprendere quanto affermato ho eseguito un semplice test per verificare quanto appena affermato.
Ho preso i digit md5 di alcune password con livelli crescenti di complessità:
- una parola classicamente usata come password: "demo";
- una parola di senso compiuto (in lingua inglese): "yellow";
- una parola di senso compiuto (in lingua italiana): "giallo";
- una parola di quattro catatteri di senso non compiuto: "zxwp";
- una parola di senso compiuto concatenata a un numero: "computer99";
- una stringa casuale alfanumerica di 8 caratteri: "g8b6rpsc".
Ho verificato la capacità di decriptare il loro hash md5 tramite uno dei diversi servizi presenti on line. Nella seguente tabella ne riporto i risultati.
password | hash | exploit |
---|---|---|
demo | fe01ce2a7fbac8fafaed7c982a04e229 | si |
yellow | d487dd0b55dfcacdd920ccbdaeafa351 | si |
giallo | 85f3c35de5e6ac28e4d31b17cbb529d3 | si |
zxwp | 82249431a26f8c4ac564333bd51b2d75 | si |
computer99 | a0859bfd08d01e6ce38994b79835b27c | no |
g8b6rpsc | 76bbb3a21ccd196c16d7f521e951a2b1 | no |
Dal test risultano confermate le assunzioni fatte in precedenza: con le raimbow table è possibile decriptare solo password "classiche" e/o semplici.
Occorre premettere che password troppo semplici non dovrebbero essere mai impiegate/consentite in quanto mettono comunque a rischio per attacchi di tipo brute force.
I salt
Con le raimbow table conoscendo l'hash di alcune parole "classiche" è possibile risalire a queste ultime. Ma c'è un rimedio: impiego dei salt.
I salt sono stringhe, più o meno complesse, che sono concatenate ad una parola data. Consideriamo come salt, ad esempio, una cosa di questo genere: "%!9?$".
Nel precedente test abbiamo verificato che gli hash associati a password particolarmente semplici possono essere facilmente decriptati.
Ad esempio, se alla stringa "yellow" concateniamo il salt "%!9?$" avremo: "yellow%!9?$". L'hash di questa stringa sarà molto sicuro e difficilmente si riuscirà a risalire alla stringa originale.
Con il salt abbiamo reso più complessa la stringa originale e, nessuna delle parole prima testate riusciranno ad essere decriptate con le raimbow table.
Le collisioni
Una stringa esadecimale di lunghezza predefinita (32 se md5 e 40 se sha1) ha un numero di combinazioni possibili, seppur grandissimo, pur sempre finito.
Al contrario le stringhe a cui è possibile applicare l'hash sono infinite: ad esempio piccole stringhe, parole, frasi ma anche interi libri.
Ciò rende inevitabili quelle che vengono tecnicamente definite le collisioni: cioè l'esistenza di due o più stringhe differenti a cui corrisponde il medesimo hashing.
Per i rischi connessi con questa problematica rimando a questo interessante articolo.
Da un punto di vista strettamente operativo queste collisioni non costituisco, dal mio punto di vista, gravi problemi di sicurezza tranne che in specifici settori.
Conclusioni
Spero con questo articolo di aver fatto chiarezza su alcuni aspetti che spesso provocano confusione.
Ma da punto di vista operativo i suggerimenti che mi sento di dare sono:
- utilizzare un sistema di hashing più sicuro rispetto ad i vecchi md5 ed sha1; su tale aspetto con php 5 ci sono state importanti novità.
- impedire la scelta di password poco complesse;
- usare i salt.
Olimpio Romanella
Sono un appassionato di Web Developing con un particolare debole per php. Mi dedico principalmente dello sviluppo back-end ed in particolare programmazione lato server con php, sviluppo di database relazionali MySql e progettazione di CMS di piccole e medie dimensioni.
Mi avvalgo del framework javascript Jquery, utilizzando molti dei suoi plugin e nei dei miei progetti utilizzo spesso il framework MVC Codeigniter.
8 Commenti presenti
Sono d'accordo che le password utente prima di cifrare con un SHA1 (o SHA2) e quindi crittografare l'algoritmo MD5.
Gentili Miriam e Olimpio, sto cercando collaborazioni per un web project. Se siete potenzialmente interessati contattatemi.
Cordiali saluti
Giancarlo
i n f o AT c u b e t a . i t
Ciao , sapresti decriptare un algoritmo di protezione di un software ? Ho la dll che esegue il controllo e il file .exe
Honda Accord 2016 Malaysia
30 November 2015 ore 18:03