MD5
L'MD5 è una funzione crittografica di hash realizzata da Ronald Rivest nel 1991 e standardizzata con la RFC 1321.
È una funzione unidirezionale diversa dalla codifica e dalla cifratura perché irreversibile.
Questa funzione prende in input una stringa di lunghezza arbitraria e ne produce in output un'altra a 128 bit. Il processo avviene molto velocemente e l'output (noto anche come "MD5 Checksum" o "MD5 Hash") restituito è tale per cui è altamente improbabile ottenere con due diverse stringhe in input uno stesso valore hash in output.
A oggi, la disponibilità di algoritmi efficienti capaci di generare stringhe che collidono (ossia che producono in output lo stesso valore di hash) in un tempo ragionevole ha reso MD5 sfavorito rispetto ad altri algoritmi di hashing (si vedano WHIRLPOOL, SHA-256 o RIPEMD-160), sebbene la sua diffusione sia tutt'oggi molto estesa per applicazioni non soggette alle collisioni (basti pensare che il controllo di integrità più frequente su file si basa proprio su MD5) dato che la proprietà di resistenza della seconda preimmagine (non invertibilità forte) di MD5 non è ancora stata violata.
Il 31 dicembre 2008, la CMU Software Engineering Institute concluse che MD5 era "cryptographically broken and unsuitable for further use" (crittograficamente fallimentare e inadatta all'uso)[1]. La fallibilità di MD5 è stata sfruttata anche nella pratica come per esempio dal tristemente famoso Flame malware nel 2012. Nel 2019, MD5 viene ancora ampiamente utilizzato malgrado l'ampiamente documentata debolezza ed inefficacia da parte degli esperti di sicurezza[2].
Storia e crittanalisi
[modifica | modifica wikitesto]I Message Digest sono una serie di algoritmi progettati dal professor Ronald Rivest al MIT. Quando studi analitici (realizzati dal crittografo tedesco Hans Dobbertin) indicarono che il predecessore dell'MD5, l'MD4, era insicuro, l'MD5 fu progettato nel 1991 come rimpiazzo.
Nel 1993 Der Boer e Bosselaers ottennero un primo risultato, anche se limitato, trovando una "pseudo-collisione" dell'algoritmo MD5; cioè due diversi vettori di inizializzazione e con 4 bit di differenza tali che:
Nel 1996 Dobbertin annunciò una collisione della funzione di compressione MD5. Anche se non rappresentava un attacco alla funzione hash MD5 completa, fu sufficiente a molti crittografi per raccomandare di passare ad un sostituto come il WHIRLPOOL, SHA-1 o RIPEMD-160.
La dimensione dell'hash a 128 bit era abbastanza piccola per contemplare un attacco del compleanno. Nel marzo 2004 iniziò il progetto distribuito MD5CRK con lo scopo di dimostrare che l'MD5 fosse un algoritmo insicuro, trovando una collisione, usando un attacco birthday.
MD5CRK durò fino a che, il 17 agosto 2004, fu trovata una collisione da Xiaoyun Wang, Dengguo Feng, Xuejia Lai e Hongbo Yu[3]. Il loro attacco su un cluster IBM p690 impiegò solo un'ora.
Il 1º marzo 2005 Arjen Lenstra, Xiaoyun Wang e Benne de Weger dimostrarono[4] la costruzione di due certificati X.509 con differenti chiavi pubbliche e lo stesso MD5 hash, di fatto una collisione. La costruzione funzionava sia per le chiavi private che per quelle pubbliche. Dopo pochi giorni Vlastimil Klima descrisse[5] un algoritmo migliorato, capace di costruire collisioni MD5 in poche ore su un singolo computer. Il 18 marzo 2006, Klima pubblicò un algoritmo[6] che riusciva a trovare una collisione in un minuto su un singolo computer, usando un metodo che chiamò tunneling.
Applicazione pratica dell'MD5
[modifica | modifica wikitesto]La crittografia tramite algoritmo MD5 viene applicata in tutti i settori dell'informatica che lavorano con il supporto delle firme digitali o che comunque trattano dati sensibili: Ad esempio, viene utilizzata per controllare che uno scambio di dati sia avvenuto senza perdite, semplicemente attraverso il confronto della stringa prodotta dal file inviato con quella prodotta dal file ricevuto. Con lo stesso metodo si può verificare se il contenuto di un file è cambiato (funzione utilizzata dai motori di ricerca per capire se una pagina deve essere nuovamente indicizzata). È diffuso anche come supporto per l'autenticazione degli utenti attraverso i linguaggi di scripting Web server-side (PHP in particolare): durante la registrazione di un utente su un portale internet, la password scelta durante il processo verrà codificata tramite MD5 e la sua firma digitale verrà memorizzata nel database (o in qualsivoglia contenitore di dati). Successivamente, durante il login la password immessa dall'utente subirà lo stesso trattamento e verrà confrontata con la copia in possesso del server, per avere la certezza dell'autenticità del login.
Esempio applicativo in PHP
[modifica | modifica wikitesto]<?php
//Assegno a una variabile la stringa che voglio codificare con l'algoritmo MD5
$my_var = 'Questa è la stringa che voglio codificare';
//Stampo a video la codifica MD5 della stringa memorizzata nella variabile
echo md5($my_var);
?>
Questo script in PHP assegna innanzitutto la stringa che vogliamo codificare a una variabile chiamata $my_var
(sarà l'input dell'algoritmo). Successivamente (attraverso l'utilizzo di echo
, che visualizza una stringa) stampa a video il valore di quella variabile in MD5 (ovvero l'output dell'algoritmo).
Il message digest prodotto in questo esempio sarà 88f2dff0f2029570a20c4d50167286b1
, che corrisponde alla stringa memorizzata nella variabile.
Bisogna comunque informare che per quanto l'utilizzo di md5 sia discretamente sicuro è anche vero che in rete esistono database ricchissimi di parole in ogni lingua registrate secondo la loro forma codificata in md5. Queste liste sono quotidianamente aggiornate e risultano spesso utili per gli attacchi a forza bruta. Al fine di evitare anche questo possibile attacco è opportuno che i programmatori codifichino in md5 il risultato di una codifica md5 precedente, così come nell'esempio sottostante
<?php
// Si fa l'md5 del risultato di un altro md5
$my_var = "miapassword";
echo md5(md5($my_var));
?>
Per superare questo problema si dovrebbe tenere un ulteriore database doppiamente più grande per memorizzare le codifiche md5 di tutte le codifiche md5 di tutte le parole. Inoltre il numero di codifiche è teoricamente illimitato:
<?php
echo md5(md5(md5(md5(md5(md5(md5(md5(md5(md5(md5(md5("mia_password"))))))))))));
?>
Un altro metodo comune per rendere gli hash MD5 resistenti agli attacchi a vocabolario o a forza bruta è quello di aggiungere del salt alla stringa da criptare, cioè un'altra stringa.
<?php
$salt="NaCl";
echo md5($salt . "mia_password");
?>
Questo metodo è comunque sensibile, come tutti gli hash MD5, agli attacchi per ricerca di collisioni.
Esempi
[modifica | modifica wikitesto]L'hash MD5 a 128 bit (16 byte) (anche chiamato message digest) è rappresentato come una sequenza di trentadue cifre esadecimali. Il seguente esempio mostra una stringa ASCII di 47 byte e il corrispondente hash MD5:
MD5("Cantami o diva del pelide Achille l'ira funesta") = b4dd7f0b0ca6c25dd46cc096e45158eb
Un piccolo cambiamento nel messaggio provocherà (molto probabilmente) un hash risultante molto differente,
per esempio sostituendo Cantami
con Contami
si ottiene:
MD5("Contami o diva del pelide Achille l'ira funesta") = f065b51db9c592bf6ecf66a76e39f8d0
Altri esempi:
MD5("Hello world") = 3e25960a79dbc69b674cd4ec67a72c62
MD5("md5") = 1bc29b36f623ba82aaf6724fd3b16718
L'hash corrispondente alla stringa vuota è:
MD5("") = d41d8cd98f00b204e9800998ecf8427e
Linux
[modifica | modifica wikitesto]Il metodo di controllo md5 viene usato da numerose distribuzioni Linux: di ogni immagine ISO viene pubblicato anche il codice hash, in modo da consentire all'utente la verifica dell'integrità dello stesso file ISO; ciò viene fatto anche sotto i sistemi operativi della famiglia Microsoft Windows.
Note
[modifica | modifica wikitesto]- ^ Dougherty Chad R, Vulnerability Note VU#836068 MD5 vulnerable to collision attacks, su Vulnerability notes database, CERT Carnegie Mellon University Software Engineering Institute, 31 Dec 2008. URL consultato il 3 febbraio 2017.
- ^ (EN) Catalin Cimpanu, A quarter of major CMSs use outdated MD5 as the default password hashing scheme, su ZDNet. URL consultato il 17 giugno 2019.
- ^ [https://eprint.iacr.org/2004/264 (archiviato dall'url originale il 5 novembre 2018).
- ^ Cryptology ePrint Archive: Report 2005/067.
- ^ Cryptology ePrint Archive: Report 2005/075.
- ^ Cryptology ePrint Archive: Report 2006/105.
Bibliografia
[modifica | modifica wikitesto]- (EN) RFC 1321 — The MD5 Message-Digest Algorithm, su datatracker.ietf.org, Internet Engineering Task Force.
- (EN) RFC 6151 — Updated Security Considerations for the MD5 Message-Digest and the HMAC-MD5 Algorithms, su datatracker.ietf.org, Internet Engineering Task Force.
Voci correlate
[modifica | modifica wikitesto]Altri progetti
[modifica | modifica wikitesto]Collegamenti esterni
[modifica | modifica wikitesto]- (EN) Denis Howe, MD5, in Free On-line Dictionary of Computing. Disponibile con licenza GFDL
- (EN) Hash'em all!. per calcolare online l'hash di stringhe e files
- (EN) Funzione md5() in PHP. (dalla documentazione ufficiale di PHP)
- (EN) MD5 database - 7,800,000,000,000. (a pagamento)
- (EN) Programmi gratuiti per calcolare l'MD5 ed il CRC32 dei file sotto i sistemi Microsoft Windows, su esrg.sourceforge.net.
- MD5 Database - 46.000.000, su md5.rednoize.com.
- MD5 OpenSSL API ed esempi, su ardoino.com. URL consultato il 20 febbraio 2008 (archiviato dall'url originale il 16 ottobre 2008).
- Delphi Implementation, su nebotov.ru.
- Online MD5 Encrypt - Decrypt, su md55md.com. URL consultato il 27 gennaio 2013 (archiviato dall'url originale il 30 luglio 2013).
- JavaScript Implementation, su neuage.biz. URL consultato il 3 novembre 2012 (archiviato dall'url originale il 5 maggio 2013).