Quanti elementi casuali prima che MD5 produca collisioni?


164

Ho una libreria di immagini su Amazon S3. Per ogni immagine, md5 l'URL di origine sul mio server più un timestamp per ottenere un nome file univoco. Dato che S3 non può avere sottodirectory, ho bisogno di archiviare tutte queste immagini in una singola cartella piatta.

Devo preoccuparmi delle collisioni nel valore hash MD5 che viene prodotto?

Bonus: quanti file potrei avere prima di iniziare a vedere le collisioni nel valore hash che MD5 produce?



2
La risposta letterale è che il secondo file potrebbe avere lo stesso MD5 del primo. Tuttavia le probabilità sono estremamente piccole.
Rick James,

Risposte:


309

La probabilità che solo due hash si scontrino accidentalmente è 1/2 128 che è 1 su 340 undecilioni 282 decilioni 366 nonillioni 920 ottilioni 938 settilioni 463 settilioni 463 quintilioni 374 quadrilioni 607 trilioni 431 miliardi 768 milioni 211 mila 456.

Tuttavia, se mantieni tutti gli hash, la probabilità è un po 'più alta grazie al paradosso del compleanno . Per avere una probabilità del 50% che un hash entri in collisione con qualsiasi altro hash, hai bisogno di 2 64 hash. Ciò significa che per ottenere una collisione, in media, è necessario hash 6 miliardi di file al secondo per 100 anni .


20
"la probabilità di collisione è 1/2 ^ 64" - che cosa? La probabilità di collisione dipende dal numero di elementi già sottoposti a hash, non è un numero fisso. In realtà, è uguale a esattamente 1 - sPn/s^n, dov'è sla dimensione dello spazio di ricerca ( 2^128in questo caso) ed nè il numero di elementi con hash. Quello a cui probabilmente stai pensando 2^64è il numero approssimativo di elementi di cui avresti bisogno per l'hash MD5 per avere una probabilità di collisione del 50%.
BlueRaja - Danny Pflughoeft,

19
+1 perché ho sempre voluto sapere come contare oltre 999 trilioni di lol (e oh sì, la tua risposta è stata istruttiva)
Kmeixner,

7
Sfortunatamente, non hai ancora ragione. Stai assumendo che la funzione hash sia veramente casuale. Non è. Ciò significa che la probabilità di collisione è maggiore.
Jørgen Fogh,

22
JørgenFogh: E anche tutte le leggi della fisica "non sono corrette". Tale livello di pedantismo non è necessario perché non cambia la risposta in modo significativo.
Kornel,

21
Quindi stai dicendo che c'è una possibilità!
vargonian

27

S3 può avere sottodirectory. Basta inserire un "/" nel nome della chiave e puoi accedere ai file come se fossero in directory separate. Lo uso per archiviare i file utente in cartelle separate in base al loro ID utente in S3.

Ad esempio: "mybucket / users / 1234 / somefile.jpg". Non è esattamente la stessa di una directory in un file system, ma l'API S3 ha alcune funzionalità che le consentono di funzionare quasi allo stesso modo. Posso chiedergli di elencare tutti i file che iniziano con "utenti / 1234 /" e mi mostreranno tutti i file in quella "directory".


7
Questo dovrebbe essere un contenuto che penso, dato che in realtà non risponde alla domanda sulla probabilità di una collisione
Ian Clark,

18

Quindi aspetta, è:

md5(filename) + timestamp

o:

md5(filename + timestamp)

Se il primo, sei la maggior parte del modo per un GUID, e non mi preoccuperei. In quest'ultimo caso, vedi il post di Karg su come andrai incontro alle collisioni.


1
Si prega di approfondire in che modo l'inclusione del timestamp aumenta le possibilità di collisione
Brad Thomas,

14
@BradThomas: No. Il rischio di collisione MD5 è lo stesso sia sul nome del file sia sulla combinazione di nome del file + data / ora. Ma nel primo scenario, dovresti avere sia una collisione MD5 che una collisione data / ora.
Vincent Hubert,

2
Ciò lascia ancora una probabilità 2 ^ (128 ^ 60) di una collisione con due utenti al minuto. Letteralmente inutilizzabile.
Berry M.

2
@BradThomas Per essere più chiari: md5(filename) + timestampriduce il rischio di collisione in modo massiccio perché sarebbe necessario avere una collisione md5 esattamente nello stesso timestamp per avere una collisione complessiva. md5(filename + timestamp)è lo stesso md5(filename), supponendo che il nome del file sia casuale per cominciare (perché l'aggiunta di più casualità a qualcosa di casuale cambia solo il risultato md5 individuale e il problema del compleanno esiste ancora in tutti gli hash md5).
robocat,


7

Sebbene le collisioni MD5 casuali siano estremamente rare, se i tuoi utenti possono fornire file (che verranno archiviati alla lettera), possono progettare collisioni. Cioè, possono deliberatamente creare due file con lo stesso MD5sum ma dati diversi. Assicurati che la tua applicazione sia in grado di gestire questo caso in modo sensato, o forse usa un hash più forte come SHA-256.


usare un sale si occuperebbe del problema ingegneristico dell'utente, no?
StackOverflow

Dipende da come viene applicato il sale. Dovrebbe essere un prefisso dei dati forniti dall'utente, o meglio ancora la chiave per un HMAC. Probabilmente è comunque una buona idea praticare la difesa in profondità.
bdonlan,

Nota sebbene SHA256 sia lungo 256 bit, è possibile compensare il rischio di collisioni con la lunghezza della chiave che si sta memorizzando troncando SHA256 a un numero inferiore di bit, ad es. Utilizzare SHA256 ma troncandolo a 128 bit (che è più sicuro dell'uso anche di MD5 sebbene abbiano lo stesso numero di bit).
robocat,

5

Mentre ci sono stati problemi ben pubblicizzati con MD5 a causa di collisioni, le collisioni involontarie tra dati casuali sono estremamente rare . D'altra parte, se si esegue l'hashing sul nome del file, non si tratta di dati casuali e mi aspetterei collisioni rapidamente.


L'unico problema che ho con l'esempio di Taylor è che se qualcuno ottiene una copia del database potrebbe probabilmente capire i numeri della carta di credito usando una tabella arcobaleno ...
Sam Saffron

1
Sebbene non sceglierei di utilizzare MD5 per le carte di credito, una tabella Rainbow con tutti i numeri di carta di credito validi tra 10.000.000 (8 cifre è la carta di credito di lunghezza minima che abbia mai visto) e 9.999.999.999.999.999 (il numero più grande di 16 cifre) è ancora un grande tabella da generare. Probabilmente ci sono modi più semplici per rubare quei numeri.
acrosman

1

Non importa quanto sia probabile; è possibile. Potrebbe accadere nelle prime due cose che hai (molto improbabile, ma possibile), quindi dovrai supportare le collisioni dall'inizio.


37
Naturalmente ci possono essere molte altre cose brutte che possono accadere con una probabilità di 1/2 ^ 128. Potresti non voler scegliere questo di cui preoccuparti.
Will Dean,

2
La cosa peggiore che può succedere qui è che puoi ottenere una foto. Per un numero relativamente piccolo non mi preoccuperei. Ora, se il tuo software sta controllando un pilota automatico che atterra su un aereo, questa è un'altra storia.
Jim C,

9
Non puoi essere serio. Per ottenere buone probabilità di collisione, dovrai hash 6 miliardi di file al secondo, ogni secondo per 100 anni. Anche se sei molto sfortunato, probabilmente ci vorrebbe più dell'intera capacità dell'S3 usata più a lungo di una vita umana.
Kornel,

13
È miliardi di volte più probabile che il tuo database e i suoi backup falliscano tutti. Non vale la pena preoccuparsi delle collisioni.
Artelius

6
Usa il tempo di prevenzione delle collisioni costruendo un bunker per mettere il tuo server! Quelle fastidiose meteore possono colpirti (molto improbabile, ma possibile), quindi dovrai supportare il riparo meteorico dall'accattonaggio.
polvoazul,

1

La collisione MD5 è estremamente improbabile. Se hai 9 trilioni di MD5, c'è solo una possibilità su 9 trilioni che ci sia una collisione.


1
Molte delle altre risposte parlano della probabilità di una collisione quando si aggiunge un altro elemento. Penso che la mia risposta sia più utile perché parla probabilmente del fatto che l'intero tavolo abbia un dup.
Rick James,

1
Questo non ha nulla a che fare con MD5 e non è corretto. È come dire che se hai 9 trilioni di gatti c'è una probabilità da 1 a 9 trilioni che qualcun altro abbia un gatto identico. Il problema chiave qui è che puoi ottenere lo stesso hash con più di un valore.
Joonas Alhonen,

@JoonasAlhonen - Sì, è vero. E molti poveri la usano come scusa per comprare un altro biglietto della lotteria che non possono permettersi.
Rick James,

Grazie, questa è in realtà una statistica molto utile. Le probabilità di aver avuto una collisione dopo l'inserimento di 9 trilioni di oggetti. Grazie.
Tom P.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.