Encontré una discusión en la que aprendí que lo que había estado haciendo no era, de hecho, salar las contraseñas, sino sazonarlas, y desde entonces he comenzado a hacer ambas cosas con una función como:
hash_function($salt.hash_function($pepper.$password)) [multiple iterations]
Ignorando el algoritmo hash elegido (quiero que esto sea una discusión sobre sales y pimientos y no algoritmos específicos, pero estoy usando uno seguro), ¿es esta una opción segura o debería hacer algo diferente? Para aquellos que no están familiarizados con los términos:
Una sal es un valor generado aleatoriamente que generalmente se almacena con la cadena en la base de datos diseñada para que sea imposible usar tablas hash para descifrar contraseñas. Como cada contraseña tiene su propia sal, todas deben ser forzadas individualmente para poder descifrarlas; sin embargo, como la sal se almacena en la base de datos con el hash de contraseña, un compromiso de la base de datos significa perder ambos.
Un pimiento es un valor estático de todo el sitio almacenado por separado de la base de datos (generalmente codificado en el código fuente de la aplicación) que pretende ser secreto. Se utiliza para que un compromiso de la base de datos no haga que la tabla de contraseñas de toda la aplicación sea bruta.
¿Me falta algo? ¿Salar y salpimentar mis contraseñas es la mejor opción para proteger la seguridad de mi usuario? ¿Hay alguna falla de seguridad potencial para hacerlo de esta manera?
Nota: Suponga a los fines de la discusión que la aplicación y la base de datos se almacenan en máquinas separadas, no comparten contraseñas, etc., por lo que una violación del servidor de la base de datos no significa automáticamente una violación del servidor de la aplicación.