Un hash "seguro" es un hash que se cree que es difícil de "falsificar" de una manera formulable y reproducible sin conocimiento previo del mensaje utilizado para crear el hash. Como esa información es generalmente secreta, de ahí la necesidad de un hash, esta es una buena propiedad de una función de hash destinada a usarse en la autenticación.
Un hash generalmente se considera "seguro" si, dado un mensaje M, una función hash hash () y un valor hash H producido por hash (M) con una longitud en bits L, ninguno de los siguientes puede realizarse en menos de O (2 L ) tiempo:
- Dado hash () y H, produce M. (resistencia previa a la imagen)
- Dados hash () y M, producen un M 2 diferente tal que hash (M 2 ) == H. (resistencia de colisión débil)
- Dado hash (), produzca M 1 y M 2 de manera que hash (M 1 ) == hash (M 2 ). (fuerte resistencia a la colisión)
Además, un hash "seguro" debe tener una longitud de hash L tal que 2 LNo es un número factible de pasos para que una computadora realice el hardware actual dado. Un hash de entero de 32 bits solo puede tener 2,1 mil millones de valores; Si bien un ataque de preimagen (encontrar un mensaje que produce un hash H específico) tomaría un tiempo, no es inviable para muchas computadoras, especialmente aquellas en manos de agencias gubernamentales autorizadas para descifrar códigos. Además, un algoritmo que crea y almacena mensajes aleatorios y sus valores hash, según la probabilidad, tendría un 50% de posibilidades de encontrar un hash duplicado con cada nuevo mensaje después de intentar solo 77,000 mensajes, y tendría un 75% de posibilidades de acertar duplicado después de solo 110,000. Incluso los hashes de 64 bits todavía tienen un 50% de posibilidades de colisionar después de probar solo unos 5 mil millones de valores. Tal es el poder del ataque de cumpleaños en pequeños hashes. Por el contrario,decillion números (1.5 * 10 34 ).
La mayoría de los ataques demostrados en hashes criptográficos han sido ataques de colisión, y han demostrado la capacidad de generar mensajes colisionantes en menos de 2 L (la mayoría todavía han sido de tiempo exponencial, pero reducir el exponente a la mitad es una reducción significativa en la complejidad, ya que hace que un hash de 256 bits tan fácil de resolver como un de 128 bits, un 128 bits tan fácil de resolver como un de 64 bits, etc.
Además del tamaño de hash pequeño, otros factores que pueden hacer que un hash sea demostrablemente inseguro son:
Bajo trabajo: un hash diseñado para ser utilizado por una tabla hash o para otros fines de tipo "suma de verificación" generalmente está diseñado para ser computacionalmente económico. Eso hace que un ataque de fuerza bruta sea mucho más fácil.
"Estado fijo": la función de hash es propensa a patrones de entrada donde el valor de hash actual de todas las entradas hasta el momento no cambia cuando se le da un byte de entrada adicional en particular. Tener "estado fijo" hace que las colisiones sean fáciles de encontrar, porque una vez que identifica un mensaje que produce un hash de "estado fijo", es trivial generar otros mensajes que tengan el mismo hash agregando bytes de entrada que mantienen el hash en su "estado fijo" ".
Difusión: cada byte de entrada del mensaje debe distribuirse entre los bytes del valor hash de una manera igualmente compleja. Ciertas funciones hash crean cambios predecibles a ciertos bits en el hash. De nuevo, esto hace que la creación de colisiones sea trivial; dado un mensaje que produce un hash, las colisiones se pueden crear fácilmente al introducir nuevos valores en el mensaje que solo afectan los bits que cambian de manera predecible.