Hashing varias veces (rondas) parece ser una práctica estándar en el hashing de contraseñas para aumentar el factor de trabajo.
Seguramente, todos estarán de acuerdo en que aumentar el factor de trabajo para calcular el hash de la contraseña es algo bueno, pero me preguntaba si no estaríamos reduciendo el factor aleatorio del hash al mismo tiempo.
Mi teoría
Tomemos un hash con una salida de n bits.
¿Es posible que nunca obtenga algunos de los valores posibles de n bits cuando ingrese todos los valores posibles de n bits?
Esto significaría que algunos valores de hash son más probables que otros, ya que pueden obtenerse a partir de valores de entrada múltiples. También significa que la función hash está creando un subciclo que puede ser muy malo.
Mi prueba
Quería comprobar si mi teoría tenía algunos méritos pero, obviamente, no tenía la potencia de cómputo necesaria para analizar una función hash real, así que creé una simplista.
Mi función genera los primeros 8 bits de SHA512.
Luego introduzco todos los valores posibles de 8 bits en esta función y guardé los resultados.
Definiciones
- Raíz: un valor de 8 bits que nunca obtienes
- Ruta: todos los valores posibles que puede obtener para una sola entrada si hash varias veces
- Ciclo: valores que se repiten cuando hash varias veces
Los resultados
- Número de raíces: 97
- Ruta más larga: 36
- Longitud promedio de la ruta: 17.21
- Número de ciclo: 5
- Ciclo más largo: 6
- Número de valores en los ciclos: 13
- Ruta más larga sin valores de ciclo: 30
- Longitud de ruta promedio sin valores de ciclo: 11.72
Una conclusión alarmante
Estos resultados significan que si hash una vez tienes 159 posibilidades, pero si hash 30 veces solo te quedan 13 posibilidades.
Otras pruebas
Agregué una sal que añadí al valor en cada ronda. Pensé que podría hacer una diferencia, pero obtengo resultados casi similares con diferentes valores de sal.
Mis preguntas
Sé que mi experimento se ha simplificado en exceso, pero:
- ¿Es posible que el hash reduzca varias veces la seguridad de una función de hash si hash demasiadas veces?
- ¿Se han realizado estudios sobre este tema?