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

164

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 produce?

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

Ben Throop
fuente
2
La respuesta literal es que el segundo archivo podría tener el mismo MD5 que el primero. Sin embargo, las probabilidades son extremadamente pequeñas.
Rick James

Respuestas:

307

La probabilidad de colisión accidental de solo dos hashes 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 billones 768 millones 211 mil 456.

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

Kornel
fuente
20
"la probabilidad de colisión es 1/2 ^ 64" - ¿qué? La probabilidad de colisión depende de la cantidad de elementos que ya están en hash, no es un número fijo. De hecho, es igual a exactamente 1 - sPn/s^n, donde ses el tamaño del espacio de búsqueda ( 2^128en este caso), y nes el número de elementos hash. Probablemente esté pensando en 2^64cuál es la cantidad aproximada de elementos que necesitaría para el hash MD5 para tener un 50% de posibilidades de colisión.
BlueRaja - Danny Pflughoeft
19
1 porque siempre he querido saber cómo contar más allá de un lol 999 billones (oh sí y su respuesta fue informativo)
Kmeixner
77
Desafortunadamente, todavía no estás en lo correcto. Está asumiendo que la función hash es verdaderamente aleatoria. No lo es. Esto significa que la probabilidad de colisión es mayor.
Jørgen Fogh
22
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.
Kornel
20
¡Entonces estás diciendo que hay una posibilidad!
Vargonian
27

S3 puede tener subdirectorios. Simplemente coloque una "/" 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 según 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 enumere todos los archivos que comienzan con "usuarios / 1234 /" y me mostrará todos los archivos en ese "directorio".

davr
fuente
77
Creo que este debería ser un contenido, ya que en realidad no responde la pregunta sobre la probabilidad de una colisión
Ian Clark
18

Entonces espera, ¿es así?

md5(filename) + timestamp

o:

md5(filename + timestamp)

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

Ryan
fuente
1
Explique cómo la inclusión de la marca de tiempo aumenta las posibilidades de colisión
Brad Thomas
14
@BradThomas: No lo hace. El riesgo de colisión MD5 es el mismo ya sea en el nombre del 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.
Vincent Hubert el
2
Esto todavía deja una probabilidad de 2 ^ (128 ^ 60) de una colisión con dos usuarios por minuto. Literalmente inutilizable.
Berry M.
2
@BradThomas Para ser más claro: md5(filename) + timestampreduce el riesgo de colisión masivamente porque necesitaría tener una colisión md5 durante exactamente la misma marca de tiempo para tener 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 resultado individual de md5 y el problema de cumpleaños todavía existe en todos los hash de md5).
robocat
10

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

Will Dean
fuente
1
Probablemente quieras decir 128 bits, no 2 ^ 128. :-)
JesperE
55
en.wikipedia.org/wiki/Birthday_Problem Más información sobre el problema.
Georg Schölly
7

Aunque las colisiones MD5 aleatorias son extremadamente raras, si sus usuarios pueden proporcionar archivos (que se almacenarán textualmente), entonces pueden diseñar colisiones para que ocurran. Es decir, pueden crear deliberadamente dos archivos con la misma suma MD5 pero con datos diferentes. Asegúrese de que su aplicación pueda manejar este caso de una manera sensata, o tal vez use un hash más fuerte como SHA-256.

bdonlan
fuente
usar una sal se encargaría del problema de ingeniería del usuario, ¿no?
StackOverflowed
Depende de cómo se aplique 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 la defensa en profundidad.
bdonlan
Tenga en cuenta que aunque SHA256 tiene 256 bits de largo, puede compensar el riesgo de colisiones con la longitud de la clave que está almacenando truncando el SHA256 a menos bits, por ejemplo, use SHA256 pero trunquelo a 128 bits (que es más seguro que usar MD5 incluso aunque tienen el mismo número de bits).
robocat
5

Si bien ha habido problemas bien publicitados con MD5 debido a colisiones, las colisiones ININTENCIONALES entre datos aleatorios son extremadamente raras . Por otro lado, si está tropezando con el nombre del archivo, no se trata de datos aleatorios, y esperaría colisiones rápidamente.

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

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

Karg
fuente
36
Por supuesto, puede haber muchas otras cosas malas que pueden suceder con una probabilidad de 1/2 ^ 128. Es posible que no desee destacar este motivo de preocupación.
Will Dean
2
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 está controlando un piloto automático que aterriza un avión, esa es otra historia.
Jim C
9
No puedes hablar en serio. Tendrá que trocear 6 mil millones de archivos por segundo, cada segundo durante 100 años para tener una buena posibilidad de colisión. Incluso si tienes muy mala suerte, probablemente tomaría más de la capacidad total de S3 utilizada durante más tiempo que una vida humana.
Kornel
12
Es miles de millones de veces más probable que su base de datos y sus copias de seguridad fallen. No vale la pena preocuparse por las colisiones.
Artelius
55
¡Usa el tiempo de prevención de colisiones construyendo un búnker para poner tu servidor! Esos meteoritos molestos pueden golpearlo (muy poco probable, pero posible), por lo que deberá apoyar el refugio de meteoritos de la mendicidad.
polvoazul
1

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.

Rick James
fuente
1
Muchas de las otras respuestas hablan sobre la probabilidad de una colisión al agregar un elemento más. Creo que mi respuesta es más útil porque habla de que probablemente toda la tabla tenga un duplicado.
Rick James
1
Esto no tiene nada que ver con MD5 y no es correcto. Es como decir que si tienes 9 billones de gatos hay una probabilidad de 1 en 9 billones de que alguien más tenga un gato idéntico. El problema clave aquí es que puede obtener el mismo hash con más de un valor.
Joonas Alhonen
@JoonasAlhonen - Sí, eso es cierto. Y mucha gente pobre usa eso como una excusa para comprar otro boleto de lotería que no pueden pagar.
Rick James el
Gracias, esta es realmente una estadística muy útil. Las probabilidades de haber tenido una colisión al insertar 9 billones de artículos. Gracias.
Tom P.