Para la parte de colisión de hash SHA-1 de su pregunta, esto se ha abordado en algunas de las respuestas.
Sin embargo, una gran parte de esto depende del tipo de archivo con el que estamos trabajando:
Mantiene el contenido general y la operación del archivo (pero, por supuesto, ahora incluye contenido malicioso que originalmente no tenía contenido modificado)
Lo que esto significa varía mucho según lo que detecte las alteraciones:
- Si se trata de un ejecutable firmado, no es una posibilidad (razonable): de alguna manera, tendría que obtener dos colisiones hash: el SHA-1 del archivo y la firma .exe interna.
- Si se trata de un ejecutable sin firmar, .com, .dll sin firmar, o similar, se pueden agregar sus tenedores de recursos de manera que no cambien su funcionamiento y, por lo tanto, podría (eventualmente) obtener una colisión de hash que no es detectable por 'normal' operación.
- Si se trata de un archivo de código fuente o estructura similar (.cs, .c, .h, .cpp, .rb, .yml, .config, .xml, .pl, .bat, .ini), las adiciones, modificaciones o eliminaciones puede limitarse a una sintaxis de comentario válida de modo que el cambio no sea discernible para la mayoría de los usos (compilarlo o ejecutarlo, no abrirlo con un editor de texto).
- Si es un .iso o .zip u otro formato de contenedor, también es más improbable ya que la mayoría de los cambios aleatorios dañarán el contenedor. Es posible hacer: agregar una entrada de archivo falsa o alterar un contenido dentro del contenedor y volver a verificarlo, pero está agregando una capa de complejidad y agregando tiempo adicional para verificar el resultado, así como tener grados limitados de libertad con respecto a cómo y qué contenido se puede cambiar.
- Si se trata de un texto o un formato similar al texto, se pueden cambiar casi de la manera que desee sin dejar de ser un archivo "válido", aunque el contenido probablemente sea notable.
- Con muchos formatos como .rtf, .doc, .html, .xslx y otros formatos de marcado, pueden agregarse o modificarse de manera que los analizadores no puedan detectarlos, de modo que no sea la longitud (o incluso con una longitud limitada , menos libertad) los archivos pueden ser alterados para (eventualmente) tener una colisión hash mientras siguen siendo no solo un archivo válido, sino que no se cambian notablemente de ninguna manera que sea visible para las aplicaciones típicas con las que se usarían.
Entonces, lo que te queda es cómo obtener colisiones en cualquier estructura que no sea corrupta y que, en cierto grado, sea indetectable:
- Realice los cambios funcionales que desee (tal vez la inserción de contenido malicioso) y realice cambios adicionales para conservar la validez específica del formato de archivo
- Agregue una sección que no será funcional (entre los bloques de comentarios, al final de un archivo de texto con 3k retornos de carro por encima, aísle un bloque de comentarios actual)
- Agregue o seleccione un carácter / punto de código / byte para modificar y pruebe todas las combinaciones válidas posibles (por ejemplo, no todas las combinaciones de bytes son válidas para diferentes codificaciones).
- Vuelva a calcular el hash, vea si la colisión coincide.
- si no es así, pase a 3.
Supongamos que tiene una computadora súper rápida y un archivo más pequeño, de modo que la modificación con una secuencia de bytes válida y volver a calcular el hash toma 1 milisegundo (probablemente requiera un hardware dedicado). Si la distribución de hash es perfectamente aleatoria y se distribuye en todo el rango, obtendrá una colisión con SHA-1 cada 2^160
intento (fuerza bruta).
2^160/1000/60/60/24/365.24
= 4.63x10^37 years
= 46,300,000,000,000,000,000,000,000,000,000,000,000 years
= 46 undecillion years.
Pero bueno, intentemos con las versiones 2^60
y 2^52
, y pretendamos que nos permiten modificar el archivo de la forma que queramos (no lo hacen) y que ellos también se pueden hacer en 1 ms en cada intento:
2^52 yields 142,714 years
/*humans might still be around to care, but not about these antiquated formats*/
2^60 yields 3.65x10^7 years = 36,500,000 years
/*machines will probably have taken over anyway*/
Pero oye, podrías tener suerte. Realmente, realmente, más de un milagro que cualquier cosa que la gente llame milagros con suerte.