Hay dos niveles:
-
Necesitas un hashing como segunda línea de defensa, para que lo que almacenes en el servidor (yo llamo "servidor" al sistema que realiza la autenticación verificando una contraseña dada) no es suficiente para suplantar a los usuarios. Esto evita la escalada de una violación parcial de solo lectura (por ejemplo, una cinta de copia de seguridad robada) a un acceso de lectura y escritura más completo. Consulte esta publicación del blog para una discusión más larga.
-
Si hash la contraseña, entonces puede necesitar usar un función de hash de contraseña si la contraseña de origen tiene poca entropía. Las contraseñas elegidas por los usuarios humanos tienen baja entropía. Si genera las contraseñas "al azar", entonces puede obtener contraseñas de alta entropía. O no. El punto positivo de generar contraseñas a través de un proceso sistemático conocido que se alimenta de un PRNG criptográficamente seguro es que puede calcular la entropía, en lugar de simplemente estimarla. Sin embargo, aún debe asegurarse de obtener suficiente.
Por ejemplo, si genera una contraseña como una secuencia de 10 caracteres aleatorios (letras en minúsculas y mayúsculas, y dígitos), y todos los caracteres se eligen de manera uniforme e independiente entre sí, entonces hay 62 10 contraseñas posibles y cada una de ellas tiene la misma probabilidad de ser elegida que cualquier otra. La entropía es entonces igual a log (62 10 ) (logaritmo en base 2), es decir, 59.54 bits. Eso no es malo, pero posiblemente aún sea demasiado bajo para la comodidad si se utiliza una función hash simple, ya que una buena GPU puede ejecutar miles de millones de MD5 o SHA-1 por segundo. Luego debe agregar sales e iteración, es decir, usar bcrypt (pero un pequeño recuento de iteraciones ya estaría bien).
Si sus contraseñas tienen al menos 80 bits de entropía, puede considerar que son lo suficientemente fuertes como para derrotar incluso a los atacantes ricos y determinados, y puede usar un hashing simple (es decir, puede salirse con una simple llamada de hash < em> y también con no usar sales). Con letras y dígitos aleatorios, esto se traduce en 14 caracteres . Insisto en que esto es cierto solo si los 14 caracteres se eligen de forma aleatoria, uniforme e independiente entre sí. Estos son requisitos que puede cumplir con su generador de contraseñas, pero no puede esperarlos de una contraseña elegida por el usuario.