Ya no tienes que investigar más por otras webs porque has llegado al sitio adecuado, poseemos la solución que quieres encontrar pero sin complicaciones.
Solución:
Cada función hash criptográfica es una función hash. Pero no todas las funciones hash son un hash criptográfico.
Una función hash criptográfica tiene como objetivo garantizar una serie de propiedades de seguridad. Lo más importante es que es difícil encontrar colisiones o preimágenes y que la salida parece aleatoria. (Hay algunas propiedades más, y “hard” tiene límites bien definidos en este contexto, pero eso no es importante aquí).
Las funciones hash no criptográficas solo intentan evitar colisiones para entradas no maliciosas. Algunos tienen como objetivo detectar cambios accidentales en los datos (CRC), otros intentan colocar objetos en diferentes depósitos en una tabla hash con la menor cantidad de colisiones posible.
A cambio de garantías más débiles, suelen ser (mucho) más rápidos.
Todavía llamaría a MD5 una función hash criptográfica, ya que tenía como objetivo proporcionar seguridad. Pero está roto y, por lo tanto, ya no se puede utilizar como hash criptográfico. Por otro lado, cuando tiene una función hash no criptográfica, realmente no puede llamarla “rota”, ya que nunca trató de ser segura en primer lugar.
Hay algunas propiedades que las funciones de hash criptográficamente seguras requieren fuertemente, que no son tan necesarias para las funciones de hash no criptográficamente seguras:
- resistencia a la preimagen (dado un hash
h
debe ser difícil encontrar un mensajem
que cedeh
cuando tiene hash - Resistencia débil a la colisión (dado un mensaje
m1
debe ser difícil encontrar un mensaje diferentem2
de modo quem1
ym2
producir el mismo hash) - fuerte resistencia a las colisiones (debería ser difícil encontrar mensajes
m1
ym2
que dan el mismo hash)
En esos puntos, ves muchos difícil, que es una medida cualitativa en lugar de cuantitativa. La mejor respuesta aquí es la viabilidad: hay una línea borrosa cuando algo se vuelve factible y esas líneas se mueven con el tiempo (a medida que las capacidades de cálculo crecen exponencialmente de acuerdo con la Ley de Moore, una vez que los problemas difíciles ahora pueden resolverse con su teléfono celular).
En general, es una buena práctica asumir que difícil significa que el tiempo para lograr alguna meta es NP-completo. Esto significa que el tiempo necesario para romper el hash aumenta considerablemente a medida que aumenta la longitud del hash.
Otro punto es que un algoritmo hash criptográficamente seguro puede ser útil en algunas aplicaciones, pero no en otras. Depende del modelo de su atacante, la naturaleza de la información que desea proteger y cosas como los requisitos de rendimiento (como regla general, cuanto mejores son las propiedades criptográficas de un hash, peor es su comportamiento en tiempo de ejecución).
Yo diría que los dos key las cosas para entender aquí son:
- El término “función hash” es vago, o más precisamente, polisémico: tiene una “familia” de significados que están estrechamente relacionados pero son distintos. Si alguien etiqueta una función como una “función hash”, la etiqueta simplemente no le dice qué propiedades debe tener esa función. Tienes que examinar el contexto donde se usa el término y los requisitos de ese contexto.
- El término “función hash criptográfica” es un nombre poco apropiado: parece una descripción, pero tiene una definición técnica complicada que el término en sí no describe en realidad. En pocas palabras, hay funciones como códigos de autenticación de mensajes (MAC) que a menudo se etiquetan como funciones hash y ofrecen alguna forma de seguridad criptográfica, pero no son “funciones hash criptográficas” en la definición convencional.
El término “función hash criptográfica” se usa convencionalmente para referirse a lo que podría etiquetarse mejor como funciones hash resistentes a colisiones, que son público functions (“public” = no requiere un secreto key) que deben tener estas tres propiedades:
- Segunda resistencia a la preimagen: Por un valor aleatorio
m1
elegido por una parte honesta, es muy costoso para un atacante encontrar algún valorm2 ≠ m1
tal quehash(m1) = hash(m2)
. - Resistencia a la preimagen: Por un valor aleatorio
h
elegido por una parte honesta, es muy costoso para un atacante encontrar algún valorm
tal quehash(m) = h
. - Resistencia a colisiones: Es muy costoso para un atacante encontrar cualquier par de valores
m1 ≠ m2
tal quehash(m1) = hash(m2)
.
Hay una cuarta propiedad en la que las funciones hash criptográficas más antiguas fallan trivialmente, pero que las más nuevas, como SHA-3 y Blake2, están diseñadas para lograr:
- Indiferenciabilidad aleatoria de oráculo: Este es casi imposible de explicar brevemente, pero vamos a reducirlo a esto: es muy costoso para un atacante encontrar correlaciones no fortuitas entre las salidas de las entradas de su elección.
La propiedad del oráculo aleatorio (cuando se formula correctamente) implica las tres propiedades anteriores, así como otras adicionales como la ausencia de ataques de extensión de longitud eficientes. (Las extensiones de longitud son la razón más obvia por la que las funciones hash antiguas como SHA-256 y SHA-512 fallan en la propiedad de oráculo aleatorio).