Al intentar hash passwords , el atacante puede Siempre usa el mismo tipo de hardware que el defensor. Lo que intenta el atacante es hacerlo mejor, utilizando un hardware especializado que le permita poner N contraseñas potenciales por menos costo total que si estuviera usando el hardware del defensor. El costo total incluye el costo de comprar el hardware, el costo de desarrollar el software relevante en él y luego el costo de ejecutar el hardware, que básicamente equivale a la electricidad utilizada (para alimentar el hardware y para enfriarlo). Para un atacante serio, el costo de energía domina.
Siempre que hay una operación que el atacante puede hacer más barato que el defensor, el atacante gana. Un punto importante es que el descifrado de contraseñas es un problema vergonzosamente paralelo : por definición, el atacante tiene muchos contraseñas potenciales para probar.
Supongamos que conectas en cascada tres funciones hash distintas Hash1
, Hash2
y Hash3
. Esto significa que el defensor debe tener las tres implementaciones a mano, todas ejecutadas en su servidor. El atacante, por otro lado, puede tener una mejor programación: puede (por ejemplo) capturar un millón de contraseñas potenciales con Hash1
y guardar los resultados en algún búfer; luego cambie el hardware a algo que aplique Hash2
, y ejecútelo sobre el millón de salidas guardadas del paso anterior, ahorrando nuevamente las salidas Hash2
en algún búfer; finalmente cambiando el hardware nuevamente, con Hash3
.
Este tipo de "cambio de hardware" es especialmente relevante cuando se utiliza FPGA : cada "cambio" es una reprogramación del mismo hardware real, y es cuestión de unos pocos segundos como máximo. Al utilizar dicha programación y almacenamiento en búfer, el costo de "cambio" es insignificante.
Esto también se puede usar como canalización: si el atacante creó tres máquinas especializadas, una para Hash1
, una para Hash2
y otra para Hash3
, entonces puede ejecutar Hash1
en la primera contraseña potencial, luego envíe la salida a la máquina que calcula Hash2
. Mientras que la segunda máquina calcula Hash2
, la primera máquina puede calcular Hash1
en otra contraseña potencial. Y así. En la práctica, el atacante puede mantener todas sus máquinas especializadas en plena ocupación en cualquier momento, por lo que se ríe de sus intentos de "aumentar la fuerza".
Además, si hay tres funciones hash distintas para implementar y solo una de ellas puede optimizarse con hardware especializado, entonces el atacante sigue ganando al optimizar esa. Para decir crudamente las cosas, si conectas en cascada bcrypt, scrypt y SHA-256, entonces el atacante usará una PC para las dos primeras y una GPU para la SHA-256, y así evitará aproximadamente 1/3 del costo.
Para resumir, la intuición de que "mezclar un conjunto de algoritmos hash diferentes debería proporcionar una fuerza adicional" es incorrecta. Hace lo contrario. Dicha mezcla aumenta los costos de desarrollo y uso para el defensor, mientras que no ralentiza al atacante (que tiene mucho paralelismo con el que beneficiarse), y aumenta las opciones de optimización del atacante.
(Todo esto se dice sin hablar de cosas prácticas, como el manejo de las sales individuales para todas las funciones en cascada y los peligros de la criptografía hecha en casa).