SHA-1 produce un hash de 160 bits. El hash de cualquier archivo de más de 160 bits (20 octetos), por lo tanto, necesariamente perderá información y hará imposible la reconstrucción. En teoría, eso es.
Por otra parte, es muy probable (prácticamente garantizado) que los archivos hashing de menos de 20 octetos produzcan un mapeo 1: 1. Una asignación 1: 1 significa que sin sal, es trivial revertir el hash a los contenidos originales con una tabla de arco iris que ya existe. Incluso con una sal no secreta típica, es muy posible ejecutar un ataque de fuerza bruta en archivos muy cortos, por lo que si le preocupa eso, debe agregar una sal que sea lo suficientemente larga (por ejemplo, 128 bits) y mantener El secreto de la sal (no es así como normalmente usaría una sal, pero también tiene una situación diferente). Además, podría agregar el nombre de cada archivo a la sal (a menos que lo que esté tratando de hacer sea la deduplicación), por lo que diferentes archivos con contenido idéntico tienen diferentes hashes.
En la práctica, aunque el hash no se puede invertir para archivos de más de 20 octetos, los archivos pequeños (pero de más de 20 octetos) pueden seguir revertirse si el atacante es lo suficientemente persistente. Por ejemplo, existen 65536 archivos con 22 octetos [1] que tienen el mismo SHA-1, y no puede probar cuál es el correcto. O puedes?
Desafortunadamente la respuesta es "sí". Si bien cada uno de esos 65 mil archivos diferentes es una solución igualmente válida desde el punto de vista del hash, solo uno de ellos (o quizás dos) será algo que no sea basura binaria aleatoria sin sentido. Lo que es trivial de identificar mediante el uso de un programa de compresión de propósito general (los archivos de texto simple son comprimibles, la basura aleatoria no lo es). Además, si se conoce el nombre de un archivo, generalmente es relativamente fácil verificar su contenido contra algunos bytes mágicos o una estructura particular. El atacante solo necesita considerar los archivos que tienen bytes mágicos que corresponden a su tipo.
Por suerte, este ataque rápidamente se vuelve impráctico. ¡Ya hay 10 28 archivos de longitud 32 que se asignan al mismo hash, y la gran mayoría de los archivos en cada computadora es más largo que eso!
Y ahora hay una sorpresa: el "más seguro" SHA-512 es, en realidad, menos seguro a este respecto. Dado que ofrece 512 bits, realizará una asignación 1: 1 para archivos de hasta 64 bytes .
Mi recomendación sería:
- Si realmente no quieres (o no puedes) usar TLS / SSH (sabes que
rsync
hará todo el conjunto de hashes comparativos incluyendo la conexión SSH para ti, no lo hagas t you?), use un contenedor de encriptación como p. ej. Truecrypt. Eso evitará que otra persona acceda a los hashes, incluso si coloca el contenedor en Internet públicamente en un servidor que no es de confianza, o si lo envía por correo electrónico.
Esto hace que cualquier otra consideración sea obsoleta. ¡No hay que preocuparse por si los hashes pueden revertirse si el atacante no los conoce!
- No utilice un hash que sea más grande de lo necesario. La posibilidad de una colisión aleatoria de hash en 10 archivos 16 (¡es 10 mil millones de veces el número de archivos actualmente en mi computadora de escritorio!) Con un hash de 160 bits es aproximadamente 10 -15 . Para diez mil archivos, son 10 -22 . En otras palabras, no sucederá en tu vida. Conjuntos de control de revisión como por ejemplo Git confía en el hecho de que las colisiones simplemente no ocurren. Los hashes más grandes no mejoran nada en tu situación, pero posiblemente empeoren las cosas (para archivos pequeños).
- Salte el contenido de los archivos con nombres de archivos y con una sal aleatoria lo suficientemente larga como para mantenerlo en secreto.
- Considere también el uso de hash de nombres de archivos, ya que los nombres de los archivos pueden transmitir información importante.
- No transmitir longitudes de archivo. No le da una ventaja, pero puede darle una a un atacante.
[1] En realidad, si no le dice al atacante la longitud del archivo, hay algunos más: también hay 256 archivos con 21 octetos y uno con 20 o menos.