¿Cuántos elementos aleatorios antes de MD5 producen colisiones?

Tengo una biblioteca de imágenes en Amazon S3. Para cada imagen, md5 la URL de origen en mi servidor más una marca de tiempo para obtener un nombre de archivo único. Como S3 no puede tener subdirectorios, necesito almacenar todas estas imágenes en una sola carpeta plana.

¿Debo preocuparme por las colisiones en el valor hash MD5 que se genera?

Bono: ¿Cuántos archivos podría tener antes de comenzar a ver colisiones en el valor hash que produce MD5?

131
agregado el autor kenorb, fuente
La respuesta literal es que el archivo segundo puede tener el mismo MD5 que el primero. Sin embargo, las probabilidades son extremadamente pequeñas.
agregado el autor Rick James, fuente

8 Respuestas

La probabilidad de que solo dos hash colisionen accidentalmente es 1/2 128 que es 1 en 340 undecillion 282 decillion 366 nonillion 920 octillion 938 septillion 463 sextillion 463 quintillion 374 quadrillion 607 trillion 431 billion 768 million 211 thousand 456.

Sin embargo, si mantienes todos los hash, la probabilidad es un poco mayor gracias a la paradoja de cumpleaños . Para tener un 50% de probabilidad de que cualquier hash colisione con cualquier otro hash, necesitas 2 64 hashes. Esto significa que para obtener una colisión, en promedio, deberá hash 6 billion archivos por segundo durante 100 años .

238
agregado
¡Entonces estás diciendo que hay una posibilidad!
agregado el autor vargonian, fuente
"probabilidad de colisión es 1/2 ^ 64" - ¿qué? La probabilidad de colisión depende de la cantidad de elementos ya machacados, no es un número fijo. De hecho, es exactamente igual a 1 - sPn/s ^ n , donde s es el tamaño del espacio de búsqueda ( 2 ^ 128 en este caso), y n es el número de elementos hash. Lo que probablemente está pensando es 2 ^ 64 , que es la cantidad aproximada de elementos que necesitaría MD5 hash para tener un 50% de posibilidades de colisión.
agregado el autor BlueRaja - Danny Pflughoeft, fuente
JørgenFogh: Y todas las leyes de la física tampoco son "correctas". Tal nivel de pedantismo es innecesario porque no cambia la respuesta de ninguna manera significativa.
agregado el autor Kornel, fuente
@yaauie No, eso es ridículamente imposible. Estoy hablando de generar 2 ^ 64 hashes de 2 ^ 128 posibles. Eso es un cuadrillonésimo de un porcentaje de todos los hashes generados.
agregado el autor Kornel, fuente
@ BlueRaja-DannyPflughoeft eso es lo que tenía en mente de hecho. Gracias por la corrección.
agregado el autor Kornel, fuente
@ConcernedOfTunbridgeWells: tomé la corrección de la paradoja del cumpleaños, que es la razón por la cual la respuesta está en miles de millones, no en billones. No pude verificar la probabilidad con su secuencia de comandos PV = 2 ** 128; SS = 2 ** 64 : OverflowError: long int demasiado grande para convertir a int
agregado el autor Kornel, fuente
No estrictamente cierto. La probabilidad de una colisión es mucho mayor que esto ya que una nueva URL podría colisionar con cualquier elemento existente en la tabla. Consulte esta publicación (exención de responsabilidad, la escribí) para una ejecución. en las matemáticas, y un pequeño script de python que se puede adaptar para calcular la probabilidad de un número particular de URL.
agregado el autor ConcernedOfTunbridgeWells, fuente
Desafortunadamente, todavía no estás en lo correcto. Estás asumiendo que la función hash es verdaderamente aleatoria. No lo es. Esto significa que la probabilidad de colisión es mayor.
agregado el autor Jørgen Fogh, fuente
+1 para agregar el cálculo. Esto es un poco más preciso: http://www.google.com/search?q=2^64%2F100* (segundos + por año)
agregado el autor Mathias Bynens, fuente
(Esto significa que para obtener una colisión, en promedio, tendrá que copiar 6 mil millones de archivos por segundo durante 100 años); incorrecto. esto significa que para el tiempo ha estado procesando 6 mil millones de archivos por segundo durante 100 años, el 50% de los hashes que está generando colisionarían con los hashes generados previamente.
agregado el autor yaauie, fuente
+1 porque siempre he querido saber cómo contar más allá de 999 billones de lol (y oh sí, tu respuesta fue informativa)
agregado el autor Kmeixner, fuente
Intuitivamente, si ignoramos la paradoja del cumpleaños y solo miramos una solución aproximada: Agregue hashes de 2 ^ 64 en una lista. Ahora agrega un hash más a esa lista. Ese hash más tiene 1/2 ^ 128 veces 2 ^ 64 posibilidad de una colisión, es decir, que un hash más tiene un 1/2 ^ 64 posibilidad de una colisión. Ahora agregue otros hashes de 2 ^ 64 a la lista y debería obtener una colisión. Haga el mismo cálculo para 2 ^ 63 (y note 2 ^ 63 + 2 ^ 63 = 2 ^ 64 ).
agregado el autor robocat, fuente

S3 puede tener subdirectorios. Simplemente ponga un "/" en el nombre de la clave y podrá acceder a los archivos como si estuvieran en directorios separados. Lo uso para almacenar archivos de usuario en carpetas separadas en función de su ID de usuario en S3.

Por ejemplo: "mybucket/users/1234/somefile.jpg". No es exactamente lo mismo que un directorio en un sistema de archivos, pero la API S3 tiene algunas características que le permiten funcionar casi igual. Puedo pedirle que liste todos los archivos que comienzan con "users/1234 /" y me mostrará todos los archivos en ese "directorio".

22
agregado
Esto debería ser un contenido, creo, ya que en realidad no responde la pregunta sobre la probabilidad de una colisión
agregado el autor Ian Clark, fuente

Así que espera, ¿es?

md5(filename) + timestamp

o:

md5(filename + timestamp)

Si es el primero, está casi todo el camino hacia un GUID, y no me preocuparía. Si es este último, entonces vea la publicación de Karg sobre cómo se encontrará eventualmente con colisiones.

16
agregado
@BradThomas: No es así. El riesgo de colisión MD5 es el mismo ya sea en el nombre de archivo o en la combinación de nombre de archivo + marca de tiempo. Pero en el primer escenario, necesitaría tener una colisión MD5 y una colisión de marca de tiempo.
agregado el autor Vincent Hubert, fuente
Esto aún deja una probabilidad de 2 ^ (128 ^ 60) de una colisión con dos usuarios por minuto. Literalmente inutilizable.
agregado el autor Berry M., fuente
Explique cómo la inclusión de la marca de tiempo aumenta las posibilidades de colisión
agregado el autor Brad Thomas, fuente
@BradThomas Para ser más claros: md5 (filename) + timestamp reduce el riesgo de colisión masivamente porque necesitaría tener una colisión md5 para que la misma marca de tiempo tenga una colisión en general. md5 (filename + timestamp) es lo mismo que md5 (filename) , suponiendo que el nombre de archivo es aleatorio para empezar (porque agregar más aleatoriedad a algo aleatorio solo cambia el md5 individual) resultado y el problema de cumpleaños aún existe en todos los hashes md5).
agregado el autor robocat, fuente

Una regla aproximada para las colisiones es la raíz cuadrada del rango de valores. Su MD5 sig tiene presumiblemente 128 bits de largo, por lo que es probable que vea colisiones por encima y más allá de 2 ^ 64 imágenes.

10
agregado
en.wikipedia.org/wiki/Birthday_Problem Algo más de información sobre el problema.
agregado el autor Georg Schölly, fuente
Probablemente signifique 128 bits, no 2 ^ 128. :-)
agregado el autor JesperE, fuente

Aunque las colisiones aleatorias de MD5 son extremadamente raras, si los usuarios pueden proporcionar archivos (que se almacenarán literalmente), entonces pueden generar colisiones. Es decir, pueden crear deliberadamente dos archivos con el mismo MD5sum pero diferentes datos. Asegúrese de que su aplicación pueda manejar este caso de manera sensata, o quizás use un hash más fuerte como SHA-256.

7
agregado
usar una sal se ocuparía del problema de ingeniería del usuario, ¿no?
agregado el autor StackOverflowed, fuente
Depende de cómo se aplica la sal. Tendría que ser un prefijo de los datos proporcionados por el usuario, o mejor aún la clave para un HMAC. Sin embargo, probablemente sea una buena idea practicar defensa en profundidad.
agregado el autor bdonlan, fuente
Tenga en cuenta que aunque SHA256 tiene 256 bits de longitud, puede sacrificar el riesgo de colisiones con la longitud de la clave que está almacenando al truncar el SHA256 en menos bits, p. utilice SHA256 pero trunque a 128 bits (que es más seguro que usar MD5 aunque tengan la misma cantidad de bits).
agregado el autor robocat, fuente

Si bien ha habido problemas bien publicitados con MD5 debido a colisiones, las colisiones NO INTENCIONALES entre datos aleatorios son excesivamente raro . Por otro lado, si utiliza el nombre del archivo, no se trata de datos aleatorios, y esperaría colisiones rápidamente.

3
agregado
El único problema que tengo con el ejemplo de taylors es que si alguien obtiene una copia de su base de datos, probablemente puedan averiguar los números de la tarjeta de crédito usando una tabla de arcoiris ...
agregado el autor Sam Saffron, fuente
Si bien no elegiría usar MD5 para tarjetas de crédito, una tabla Rainbow de todos los números de tarjetas de crédito válidos entre 10,000,000 (8 dígitos es la tarjeta de crédito de menor tamaño que he visto) y 9,999,999,999,999,999 (número más grande de 16 dígitos) sigue siendo grande tabla para generar Probablemente haya formas más fáciles de robar esos números.
agregado el autor acrosman, fuente

La colisión MD5 es extremadamente improbable. Si tienes 9 billones de MD5, solo hay una posibilidad en 9 billones de que haya una colisión.

0
agregado
Muchas de las otras respuestas hablan de la probabilidad de una colisión cuando se agrega un elemento más. Creo que mi Answer es más útil porque habla de la tabla que probablemente tenga todo el dup.
agregado el autor Rick James, fuente

Realmente no importa qué tan probable sea; es posible. Podría suceder en las dos primeras cosas que hash (muy poco probable, pero posible), por lo que tendrás que soportar las colisiones desde el principio.

0
agregado
Por supuesto, puede haber muchas otras cosas malas que pueden suceder con una probabilidad de 1/2 ^ 128. Es posible que no desee destacar esta de la que preocuparse.
agregado el autor Will Dean, fuente
No puedes hablar en serio Tendrá que copiar 6 mil millones de archivos por segundo, cada segundo durante 100 años para tener buenas posibilidades de colisión. Incluso si tiene muy mala suerte, probablemente tomaría más de la capacidad total de S3 utilizada durante más tiempo que una vida humana.
agregado el autor Kornel, fuente
Lo peor que puede pasar aquí es que puedas obtener una foto. Por un número relativamente pequeño, no me preocuparía. Ahora, si su software controla un piloto automático que aterriza en un avión, esa es otra historia.
agregado el autor Jim C, fuente
Es miles de millones de veces más probable que falle su base de datos y sus copias de seguridad. No vale la pena preocuparse por las colisiones.
agregado el autor Artelius, fuente
¡Usa el tiempo de prevención de colisiones construyendo un búnker para poner tu servidor! Esos molestos meteoros pueden golpearlo (muy poco probable, pero es posible), por lo que tendrá que soportar el refugio de meteoritos de la mendicidad.
agregado el autor polvoazul, fuente
Llevaría 100 años obtener una 50% de colisión a 6G archivos/seg. Tiene una buena posibilidad de colisión décadas antes.
agregado el autor user327961, fuente