Bien, entonces el sitio genera una contraseña aleatoria para cada usuario en el momento del registro. Una pregunta importante es si un usuario puede configurar manualmente su contraseña más tarde, o si se les obliga a usar una contraseña aleatoria generada por el sitio. Veamos los dos casos por separado.
Contraseñas aleatorias
Por lo que puedo decir, este es el escenario que está describiendo en la pregunta. Desafortunadamente, tu desarrollador es (en su mayoría) correcto . Al menos sobre la iteración única de hash vs un hash lento grande. Su pregunta tiene el sabor de aplicar ciegamente "mejores prácticas" sin tener en cuenta para qué estaban destinadas esas prácticas. Para un ejemplo brillante de esto, aquí está una buena lectura:
El chico que inventó esas molestas reglas de contraseña ahora lamenta perder tu tiempo
Sugerencia
Cambie de MD5
a SHA256
, probablemente agregue una sal por usuario y tal vez considere usar contraseñas de 32 caracteres. Pero agregar una función de hashing lenta y grande aumentará la carga de su servidor por poco o nada de seguridad (al menos, al menos cualquier otro error en su implementación).
Entender el hash como una mitigación de fuerza bruta
La cantidad de trabajo que debe realizar un atacante de fuerza bruta que ha robado su base de datos para descifrar los hashes de contraseña es aproximadamente:
entropy_of_password * number_of_hash_iterations * slowness_of_hash_function
donde entropy_of_password
es el número de posibilidades o "capacidad de detección" de la contraseña. Mientras esta "fórmula" sea más alta que 128 bits de entropía (o factor de trabajo equivalente o número de instrucciones hash para ejecutar), entonces está bien. Para las contraseñas elegidas por el usuario, el entropy_of_password
es abismalmente bajo, por lo que necesita muchas iteraciones (como 100.000) de una función hash muy lenta (como PBKDF2
o scrypt
) para obtener el factor de trabajo.
Por "dígitos hexadecimales de 20 dígitos" Supongo que quiere decir que hay 16 20 = 2 80 posibles contraseñas, que es inferior a la "mejor práctica" 2 < sup> 128 , pero a menos que seas un gobierno o un banco, probablemente tengas suficiente seguridad de fuerza bruta solo a partir de la entropía de la contraseña.
Las sales
tampoco tienen ningún propósito aquí porque el cálculo previo de todos los hash es como 2 80 * 32 bits / hash, que es aproximadamente 1 ZB (o 5000 x la capacidad de todos los discos duros del planeta combinados ). Las tablas Rainbow ayudan un poco, pero francamente, cualquier atacante capaz de hacer eso merece ser parte de todos nosotros.
Aún desea cifrar la contraseña para evitar que el atacante elimine el texto sin formato de forma gratuita, pero una iteración de hash es suficiente. Sin embargo, cambie de MD5
a SHA256
y quizás considere usar contraseñas de 32 caracteres.
contraseñas del cerebro humano
Los comentaristas de este hilo parecen obsesionados con la idea de que, a pesar de su declaración de que el sitio genera contraseñas, los usuarios pueden elegir sus propias contraseñas.
Tan pronto como el usuario tenga la posibilidad de cambiar la contraseña, la única iteración de hash no es una opción para almacenar la contraseña de baja entropía. En este caso, tiene razón en que necesita hacer todas las mejores prácticas para el almacenamiento de contraseñas.
Salado
De cualquier manera (contraseñas elegidas por el usuario o aleatorias) probablemente querrás un salt por usuario.
Si es elegido por el usuario , las sales forman parte de las mejores prácticas. 'nuff dijo.
Si es aleatorio , @GordonDavisson señala un ataque realmente bueno en los comentarios [1] , [2] basado en la observación de que una búsqueda de db es esencialmente gratis en comparación a una computación hash. Calcular un hash y compararlo con los hashes de todos los usuarios es esencialmente el mismo costo que compararlo con el hash de un usuario específico . Mientras esté contento de ingresar a la cuenta de cualquier (en lugar de intentar descifrar una cuenta de específica ), mientras más usuarios haya en el sistema, más eficiente será el ataque.
Por ejemplo, supongamos que roba la base de datos hash sin sal de un sistema con un millón de cuentas (aproximadamente 2 20 ). Con 2 20 cuentas, estadísticamente espera obtener un impacto en las primeras 2 60 suposiciones. Todavía estás haciendo O (2 80 ) adivina , pero O (2 60 ) hashes * O (2 20 ) búsquedas de base de datos ~ = hashes de O (2 60 ).
Las sales por usuario son la única forma de evitar que ataque a todos los usuarios por el costo de atacar a un usuario .