Dos razones principales por las que no puede revertir un algoritmo hash (o incluso mejor un algoritmo hash criptográfico):
1.) Los algoritmos de hash están construidos con funciones unidireccionales diseñadas para ser computacionalmente inviables de revertir. Lo que quiero decir con esto es que, si bien siempre van a surgir colisiones (dada una salida lo suficientemente pequeña y una entrada lo suficientemente grande, vea la respuesta de Miguel Paraz), los buenos algoritmos de hash criptográficos se diseñan utilizando algoritmos que se sabe que son computacionalmente difíciles retroceder.
Un buen ejemplo de una función unidireccional es la siguiente:
X = h (n, q) = n * q.
- ¿Qué es lo más loco que has hecho en tu laboratorio de computación?
- ¿Cómo rastrea Quora a los espectadores de una pregunta / respuesta / publicación de blog?
- ¿Cómo funciona la máquina de votación electrónica? ¿Y cuáles son los pasos dados para que sea hacker a prueba?
- ¿Cuál es el mejor foro de piratería de todos los tiempos?
- Si saben con certeza que los piratas informáticos eventualmente los robarán, ¿por qué las celebridades femeninas hacen esas fotos?
Dado X, es computacionalmente difícil buscar el par n * q. Tendría que buscar el producto de un par de números hasta X, un problema O (X ^ 2). Si X es lo suficientemente grande, básicamente estás jodido (este es un ejemplo del problema de factorización del producto: ver Función unidireccional)
Los hash criptográficos de la vida real son mucho más complicados que esto, y usan otros trucos para obligar a los criptoanalistas a abordar problemas no resueltos en matemáticas como el problema del logaritmo discreto.
2.) Las sales se usan con frecuencia para complicar aún más la inversión de los hashes. Las buenas estructuras de hash, como las que se usan para almacenar contraseñas, con frecuencia emplean sales para hacer que la reversión de sus funciones internas de un solo sentido sea aún más complicada.
Una sal es un dato que se agrega a la entrada de un hash. Complica el problema de revertir el hash porque incluso la fuerza bruta que fuerza la entrada a través del algoritmo no necesariamente devolverá el mismo resultado.
Por ejemplo, supongamos que agrego una “sal” constante seleccionada al azar en mi algoritmo de hashing anterior. Mi nuevo algoritmo es el siguiente:
X = h (n, q) = n * q * sal.
Incluso si tengo suerte y encuentro n y Q, ahora necesito encontrar “sal” o esperar que el algoritmo seleccione la misma constante que obtuve cuando se creó X por primera vez.
También puede agregar un elemento temporal a esta estructura haciendo que la generación de su sal sea una función del tiempo o el lugar (es decir, cuando se generó el hash). Con frecuencia, esto se emplea sembrando un generador de números pseudoaleatorio con datos temporales o basados en la ubicación geográfica, como qué hora es, dónde se encontraba la computadora que generó el hash en el mundo o alguna combinación de los dos.
De esta forma, necesitaría recopilar mucha más información sobre cómo se creó el hash y cuándo se creó antes de lanzarlo en el camino de romper la función unidireccional.