Depende de lo que quieras defenderte
La seguridad nunca es un juego único para todos. Si lo fuera, entonces no habría 12941 algoritmos hash diferentes. En su lugar, debe comprender que cada medida de seguridad lo defiende contra un tipo específico de ataque. Pones una contraseña en tu computadora para defenderse contra el acceso de personas al azar, no porque sea tan divertido escribir whereD1DweG0sowron6
cada vez que inicies sesión.
En cuanto a los algoritmos hash, puede clasificarlos groseramente como "hashes criptográficos" y "hashes no criptográficos". Los algoritmos de hash criptográficos están diseñados para soportar una serie de ataques, mientras que los hash no criptográficos están diseñados para ser lo más rápido posible. 1 MD5, por ejemplo, se considera un hash criptográfico, pero está tan roto que solo se puede utilizar como un hash no criptográfico.
Cuándo usar un hash no criptográfico
Si su objetivo es detectar bit-flips al copiar un archivo de una ubicación a otra (por ejemplo, una unidad de memoria USB a una computadora portátil), MD5 es absolutamente la opción correcta. Incluso me atrevería a decir que cualquier hash no criptográfico rápido es bueno. Cuando copia archivos, en realidad no necesita temer la interferencia del atacante. Si estás paranoico de que los hackers puedan modificar tu kernel, agregar hashes no resolverá tus problemas.
Verificación de la integridad del archivo con interferencia del atacante
Si pretende firmar y publicar esos archivos, entonces un atacante podría tener la capacidad de crear un archivo posiblemente legítimo con el mismo hash, lo que significa que su firma es igual de válida en el archivo malicioso.
Un ejemplo
Supongamos que su mensaje original m1
se ve así:
¡Por la presente declaro que las reglas del conejito!
Usted usa su función de hash h(m1)
y obtiene el resumen d1
. Luego, usted firma el resumen d1
y obtiene una firma s1
.
Luego publicas tu mensaje m1
, tu firma s1
y tu función hash h()
.
Podría ser el atacante en el escenario y crear un mensaje m2
que tenga exactamente el mismo hash en la función hash elegida:
Se sabe públicamente que los perros son mejores que los conejos en todos los aspectos ...
Desde h(m1) = h(m2) = d1
, la firma s1
es válida tanto para su original m1
como para mi malicioso m2
.
Para defenderse de tales ataques, es vital elegir un algoritmo hash fuerte con alta resistencia a las colisiones. Esto significa que me resulta muy difícil encontrar un m2
donde h(m2) = h(m1)
.
Las buenas opciones incluirían SHA256 y SHA512, así como muchas otras. Parece que todos tienen algunas funciones hash favoritas no convencionales, pero SHA256 y SHA512 tienen un soporte muy extendido y será difícil para usted encontrar un sistema que no admita estos hashes. Y como sus archivos son muy pequeños, el cálculo del hash debería ser casi instantáneo.
Por ejemplo, en mi máquina de 800MHz, el cálculo del hash SHA512 de un archivo aleatorio de 16k tomó 3 ms, por lo que incluso en una tostadora debería ser relativamente rápido.
1 Puedes ver lo mismo con los generadores de números aleatorios. Los PRNG criptográficos tienen como objetivo proporcionar números aleatorios que son realmente difíciles de adivinar, mientras que los PRNG no criptográficos tienen como objetivo dar números que parezcan aleatorios a primera vista y hacer eso rápido.