Dado que el contexto de esto parece ser el descifrado de contraseñas y los hash criptográficos no son adecuados para almacenar contraseñas, la respuesta simple es simplemente "su pregunta es irrelevante".
Una buena función hash criptográfica tiene varios objetivos de diseño básicos:
- Debería ser computacionalmente factible calcular un hash H (x) para algún valor de entrada x.
- Cambiar un bit de la entrada debería cambiar todos los bits de salida con una probabilidad del 50%.
- Dada solo la salida de hash, no debería ser computacionalmente viable recuperar ninguna información sobre la entrada (aparte de ataques genéricos como tablas de arco iris).
- Dada una entrada x 1 , no debería ser computacionalmente factible encontrar otra entrada x 2 que satisfaga la condición H (x 1 ) == H (x 2 ), es decir, debería ser difícil encontrar colisiones.
Si bien estos objetivos básicos son ciertamente útiles, en realidad no cubren todos los requisitos de una buena función de almacenamiento de contraseñas. Para responder a su pregunta de manera más específica: el costo computacional grande o controlable ciertamente no es una característica de la mayoría de las funciones hash criptográficas "comunes".
Una buena función de almacenamiento de contraseña, junto con todo lo anterior, debe tener estos objetivos de diseño adicionales:
- No debe ser determinista, es decir, dos contraseñas iguales para diferentes usuarios (u otras entidades) no deben dar como resultado el mismo hash de salida.
- Debería implementar algún tipo de defensa contra ataques de precomputación (por ejemplo, tablas de arco iris)
- Debería ser computacionalmente costoso forzar bruscamente la entrada original para todas las entradas del diccionario, excepto las triviales y comunes. Esto generalmente se controla mediante la implementación de un valor de costo, que permite la escala del rendimiento.
- No debería haber una manera de producir más que ganancias de rendimiento despreciables utilizando compensaciones de tiempo / espacio.
- El rendimiento de la función debe ser más o menos lineal en todas las arquitecturas, para evitar la aceleración por parte de las GPU, FPGA, etc., tal vez excluyendo el silicio diseñado específicamente.
Algunos de estos objetivos son similares a los implementados por funciones de derivación de claves (KDF) como PBKDF2, pero nuevamente estas funciones no están diseñadas para el almacenamiento de contraseñas, y en cambio se han apropiado para tales usos .
Aunque actualmente solo hay unos pocos diseños que implementan todo lo anterior, es un campo relativamente nuevo, por lo que se esperan trabajos futuros. Como cuestión de interés, el estado actual de la técnica para el almacenamiento de contraseñas, según PHC , es Argon .