Attacchi di collisione MD5: sono rilevanti nell'hash delle password?

29

DISCLAIMER: This is not an endorsement of MD5 as a password hashing function. I know about parallelization, GPUs, and dedicated password hashing functions like bcrypt and scrypt.

Con tutto ciò, sto diventando almeno un po 'irritato quando ogni volta che qualcuno menziona "MD5" e "hashing della password" nella stessa frase, il hivemind salta dentro e urla "MD5 è rotto ! " (di solito seguito da un suggerimento disinformato di usare un'altra funzione di hashing generico come SHA - *).

Ma è davvero? Per quanto ne so, tutti gli attacchi fattibili su MD5 sono attacchi con prefisso scelto. Qualcuno di questi è in qualche modo applicabile alle password hash?

E in una domanda correlata: mentre le collisioni di hash sono 2 n / 2 , significa veramente qualcosa se usato contro le password, specialmente sul web? Solo perché hai trovato una collisione non significa che sarai in grado di inviarli nel campo della password, che di solito è limitato in lunghezza e probabilmente non binario sicuro.

Questo non significa che ai fini delle password di hashing, una funzione è veramente rotta solo se c'è un attacco preimage su di esso? E per quanto ne so, l'attacco preimage di MD5 è ancora 2 123.4 , che non è affatto vicino possibile.

Nota: la bruteforcing di una password debole richiederà molto meno di 2 123.4 , e sì MD5 è veloce (in base alla progettazione). Non sono interessato a nessuno di questi problemi, che non sono realmente colpa di MD5.

    
posta Null 25.10.2012 - 01:24
fonte

3 risposte

18

Gli attacchi di collisione non hanno alcun impatto sulla password hashing , anche se possono esserci alcuni dettagli a seconda di cosa si ha per hash. In parole povere, quando abbiamo cancellato le password, potremmo voler fare due cose:

  • Verifica che l'hash della password abbia un determinato valore memorizzato: questa è verifica della password (ad esempio per sapere se concedere l'accesso di accesso a un server).

  • Calcola una chiave simmetrica grande deterministicamente dalla password: questa è la derivazione della chiave (ad esempio per crittografare un file).

La verifica della password funziona solo sulla resistenza alle pre-immagini (la difficoltà nel trovare un valore m tale che h (m) corrisponda a un dato risultato). Tuttavia, la derivazione delle chiavi richiede un po 'di più. Idealmente, per la derivazione della chiave, la funzione di hash dovrebbe comportarsi il più vicino possibile al mitico oracolo casuale . Sappiamo già che le funzioni hash si basano sulla costruzione Merkle-Damgård , come MD5 o SHA-256, sono non oracoli casuali (a causa dell '"attacco di estensione della lunghezza"); tuttavia, possiamo utilizzare tali funzioni in HMAC , che usa due invocazioni di funzioni hash annidate precisamente per evitare problemi con la costruzione di MD. Ma HMAC è "provato" sicuro solo relativamente a una proprietà interna della funzione hash (vale a dire, la "funzione di compressione" interna dovrebbe essere indistinguibile da un PRF) e sappiamo che questa proprietà non è soddisfatta in il caso di MD5, perché altrimenti gli attacchi di collisione non sarebbero fattibili ...

Per riassumere, quando si utilizza MD5 per la derivazione delle chiavi, è necessario applicare schemi come HMAC-DRBG (un PRNG basato su ripetute invocazioni HMAC), che utilizzano internamente MD5. Tali schemi sono noti per essere forti fino a quando la funzione di hash è strong, e mentre gli attacchi di collisione non si applicano direttamente, mostrano che questa "forza" non è raggiunta. Quindi, la garanzia è nulla. Nessuno sa, al momento, come indebolire HMAC / MD5, ma abbiamo l'esempio di MD4: MD4 è completamente rotto per le collisioni (le collisioni possono essere prodotte "istantaneamente"), e c'è un attacco noto su HMAC / MD4 che è abbastanza costoso ma nondimeno molto più veloce del teorico 2 128 . Gli attacchi su HMAC / MD4 non sfruttano le collisioni, ma si basano su percorsi differenziali che sono la stessa fonte da cui sono stati progettati gli attacchi di collisione. Pertanto, altamente sospetto che HMAC / MD5 non è strong come, per esempio, HMAC / SHA-256 (anche se troncato a 128 bit).

Corrispondentemente, per la derivazione della chiave, non usare MD5. Non sarebbe rotto subito , ma sta ancora cercando problemi. Non è necessario eseguire immediatamente la migrazione dei sistemi esistenti che utilizzano MD5 per l'hashing delle password, ma per i nuovi progetti, è necessario evitarlo.

Promemoria obbligatorio: Ovviamente, quando si utilizzano password di hashing, indipendentemente dall'utilizzo previsto (verifica della password o derivazione della chiave), si applicano i sali e la lentezza configurabile . Una password è di per sé una debolezza a causa delle limitazioni biologiche del cervello umano che la gestisce. I sali e la lentezza configurabile sono i modi per affrontarlo: i sali ostacolano il parallelismo (l'attaccante non può condividere i costi di attacco tra diverse istanze di password, ad esempio attraverso tabelle precalcolate come tavole arcobaleno ) e sconfitte di lentezza legge di Moore (i computer diventano più veloci nel tempo, ma umani il cervello non lo fa). Quindi non vorrai digitare una password con "solo MD5", ma piuttosto usare una funzione di hashing della password dedicata come PBKDF2 o bcrypt . PBKDF2 utilizza internamente una funzione di hash, ad es. MD5. Accade così che MD5 (come SHA-256) si adatti molto bene alle capacità di calcolo di GPU , il che rende discutibile scelta per questo lavoro, e bcrypt è indubbiamente migliore (si veda questa risposta per i dettagli ).

    
risposta data 25.10.2012 - 13:26
fonte
6
La resistenza

Collisione è irrilevante per l'hashing della password. La proprietà importante è la prima resistenza pre-immagine . L'unico attacco pratico contro MD5 è la ricerca di collisioni.

Quindi non esiste un attacco pratico contro l'hashing della password basato su MD5 che non si applica ugualmente ad altre funzioni di hash veloce, come SHA-2. Non importa se usi MD5 o SHA-2, l'attacco più strong è indovinare la password.

    
risposta data 25.10.2012 - 10:38
fonte
5

MD5 è rotto perché è possibile farlo scontrare abbastanza facilmente. Tuttavia, questo trasferisce ad applicazioni come i certificati x509 in quanto può essere lead scontrare, cioè cambiare la chiave pubblica nel certificato in modo tale che l'MD5 dell'intero certificato entri in collisione con l'originale di quel certificato .

L'unico vantaggio derivante dalla resistenza alla collisione rotta di MD5 in relazione al cracking della password è la ricerca di due "password" che si comportano allo stesso modo con MD5. Se si limita una di queste "password" a un valore particolare, si torna a preimage resistenza ancora.

Come dice Wikipedia:

On 1 March 2005, Arjen Lenstra, Xiaoyun Wang, and Benne de Weger demonstrated[12] construction of two X.509 certificates with different public keys and the same MD5 hash, a demonstrably practical collision. The construction included private keys for both public keys. A few days later, Vlastimil Klima described[13] an improved algorithm, able to construct MD5 collisions in a few hours on a single notebook computer. On 18 March 2006, Klima published an algorithm[14] that can find a collision within one minute on a single notebook computer, using a method he calls tunneling.

Il terzo paragrafo è interessante, in cui si sostiene che non tutte le preimmaginazioni possono rientrare nel campo della password. Probabilmente sei corretto anche qui; l'inserimento di tale password può deve avvenire ad un livello più basso, il più vicino possibile al calcolo MD5.

Si potrebbe dire che una funzione di hash è veramente rotta solo quando la sua resistenza di preimage è rotta, ma per molte applicazioni, specialmente la firma di documenti, la resistenza di collisione rotta di MD5 è importante. Supponiamo che abbiate hash alcuni documenti critici con un codice di autenticazione dei messaggi MD5. Un avversario può essere in grado di riprodurre documenti scritti che sembrano intelligenti nella forma, racconta una storia completamente diversa e produce ancora lo stesso MD5. Puoi chiamarlo collisione piombo .

Quando viene detto, prova a trovare questa password: 2c89571cdfd318509c05d1f19fe26336

    
risposta data 25.10.2012 - 08:06
fonte

Leggi altre domande sui tag