8 commenti php

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.

 

passwordhashexploit
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

avatar Honda Accord 2016 Malaysia

Honda Accord 2016 Malaysia

30 November 2015 ore 18:03

Vi contatto perchè vorremmo fare pubblicità sul vostro sito
con banner e text link specifici per il vostro pubblico pagati a click.

Per maggiori informazioni vi invito a rispondere a questa mail
e sarò felice di approfondire tutti i dettagli della collaborazione.

avatar Mike Andrew

Mike Andrew

30 November 2015 ore 18:02

Poi criptare l'algoritmo con MD5. come detto non ho trovato niente online a riguardo, ne qualcuno che l'abbia fatto, ne qualcuno che spieghi perchè non è consigliabile farlo. la mia unica conclusione logica è che possa essere pesante dal punto di vista computazionale, ma una volta implementato in locale è stato istantaneo. sapresti svelarmi l'arcano? dovrebbe essere impossibile l'attacco tramite rainbows table...

avatar Toyota Tundra

Toyota Tundra

12 September 2015 ore 18:39

Sono d'accordo che le password utente prima di cifrare con un SHA1 (o SHA2) e quindi crittografare l'algoritmo MD5.

avatar Giancarlo

Giancarlo

27 April 2015 ore 20:51

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

avatar stefano

stefano

13 January 2015 ore 23:46

Ciao , sapresti decriptare un algoritmo di protezione di un software ? Ho la dll che esegue il controllo e il file .exe

avatar Nome

Nome

04 October 2014 ore 17:18

Cambiate questo schifo di carattere che è illegibile! Grazie

avatar Miriam Lanza

Miriam Lanza

05 March 2014 ore 11:44

Gentile staff,
sono Miriam Lanza e mi occupo della promozione on line di Bakeca.it.

Vi contatto perchè vorremmo fare pubblicità sul vostro sito
con banner e text link specifici per il vostro pubblico pagati a click.

Per maggiori informazioni vi invito a rispondere a questa mail
e sarò felice di approfondire tutti i dettagli della collaborazione.

Saluti e a presto,

Miriam Lanza

avatar Federico

Federico

13 February 2014 ore 09:56

ciao, ho cercato qualcosa online, ma non ho trovato niente. io pensavo di criptare la password degli utenti prima con un SHA1 (o anche SHA2) e poi criptare l'algoritmo con MD5. come detto non ho trovato niente online a riguardo, ne qualcuno che l'abbia fatto, ne qualcuno che spieghi perchè non è consigliabile farlo. la mia unica conclusione logica è che possa essere pesante dal punto di vista computazionale, ma una volta implementato in locale è stato istantaneo. sapresti svelarmi l'arcano? dovrebbe essere impossibile l'attacco tramite rainbows table...