hash - encrypt - ¿El MD5 sigue siendo lo suficientemente bueno como para identificar de manera única los archivos?
md5 hash decrypt (9)
¿Es el hash MD5 un archivo aún considerado un método lo suficientemente bueno como para identificarlo de manera única, dado el rompimiento del algoritmo MD5 y los problemas de seguridad, etc.? La seguridad no es mi principal preocupación aquí, pero es la identificación única de cada archivo.
¿Alguna idea?
A efectos prácticos, el hash creado podría ser adecuadamente aleatorio, pero teóricamente siempre hay una probabilidad de colisión, debido al principio de Pigeonhole . Tener hashes diferentes ciertamente significa que los archivos son diferentes, pero obtener el mismo hash no significa necesariamente que los archivos sean idénticos.
El uso de una función hash para ese fin, sin importar si la seguridad es una preocupación o no, siempre debe ser el primer paso de una verificación, especialmente si se sabe que el algoritmo hash crea colisiones fácilmente. Para saber de manera confiable si dos archivos con el mismo hash son diferentes, tendría que comparar esos archivos byte a byte.
Cuando se procesan cadenas cortas (<unas pocas K?) (O archivos), se pueden crear dos claves hash md5, una para la cadena real y una segunda para el reverso de la cadena concatenada con una cadena asimétrica corta. Ejemplo: md5 (reverse (string || ''1010'')). Agregar la cadena adicional asegura que incluso los archivos que constan de una serie de bits idénticos generan dos claves diferentes. Por favor, comprendan que incluso bajo este esquema hay una posibilidad teórica de que las dos claves hash sean idénticas para las cadenas no idénticas, pero la probabilidad parece extremadamente pequeña, algo en el orden del cuadrado de la probabilidad de colisión simple md5, y el ahorro de tiempo puede ser considerable cuando la cantidad de archivos crece. También se podrían considerar esquemas más elaborados para crear la segunda cadena, pero no estoy seguro de que estos mejoren sustancialmente las probabilidades.
Para verificar colisiones, se puede ejecutar esta prueba para la unicidad de las claves hash md5 para todos los bit_vectors en un db:
seleccione md5 (bit_vector), count (*), bit_and (bit_vector) de db con bit_vector
agrupar por md5 (bit_vector), bit_vector tener bit_and (bit_vector) <> bit_vector
MD5 se ha roto, puede usar SHA1 en su lugar (implementado en la mayoría de los idiomas)
MD5 será lo suficientemente bueno si no tienes adversario. Sin embargo, alguien puede (intencionalmente) crear dos archivos distintos cuyo hash tenga el mismo valor (lo que se conoce como colisión), y esto puede o no ser un problema, dependiendo de su situación exacta.
Dado que saber si las debilidades conocidas de MD5 se aplican a un contexto dado es un asunto sutil, se recomienda no usar MD5. Usar una función hash resistente a colisiones (SHA-256 o SHA-512) es la respuesta segura. Además, usar MD5 es una mala relación pública (si usa MD5, prepárese para justificarse a sí mismo, mientras que nadie cuestionará su uso de SHA-256).
Me gusta pensar en MD5 como un indicador de probabilidad al almacenar una gran cantidad de datos de archivos.
Si los hashes son iguales, entonces sé que tengo que comparar los archivos byte a byte, pero eso solo puede suceder algunas veces por una razón falsa, de lo contrario (los hash no son iguales) Puedo estar seguro de que estamos hablando de dos archivos diferentes .
No lo recomendaría. Si la aplicación funcionara en un sistema multiusuario, podría haber un usuario, que tendría dos archivos con el mismo hash md5 (podría ser ingeniero y jugar con esos archivos, o simplemente tener curiosidad; se pueden descargar fácilmente desde http://www2.mat.dtu.dk/people/S.Thomsen/wangmd5/samples.html , yo mismo al escribir esta respuesta descargué dos muestras). Otra cosa es que algunas aplicaciones pueden almacenar dichos duplicados por cualquier razón (no estoy seguro, si hay alguna de esas aplicaciones, pero existe la posibilidad).
Si identifica de forma única los archivos generados por su programa, diría que está bien usar MD5. De lo contrario, recomendaría cualquier otra función hash donde todavía no se conozcan las colisiones.
Personalmente, creo que las personas usan sumas de comprobación sin procesar (elija su método) de otros objetos para actuar como identificadores únicos demasiado cuando lo que realmente quieren hacer es tener identificadores únicos. La toma de huellas dactilares de un objeto para este uso no era la intención y es probable que requiera más pensamiento que el uso de un uuid o mecanismo de integridad similar.
Sí. MD5 se ha roto por completo desde una perspectiva de seguridad, pero la probabilidad de una colisión accidental es aún pequeña. Solo asegúrese de que los archivos no estén siendo creados por alguien en quien no confíe y que puedan tener intenciones maliciosas.
Un md5 puede producir colisiones. Teóricamente, aunque es poco probable, un millón de archivos seguidos pueden producir el mismo hash. No pruebe su suerte y verifique colisiones md5 antes de almacenar el valor.
Personalmente, me gusta crear md5 de cadenas aleatorias, lo que reduce la sobrecarga de hash de archivos de gran tamaño. Cuando se encuentran colisiones, iterar y volver a hash con el contador de bucle adjunto.
Puede leer sobre el principio de casillero .