Buenas prácticas: contraseñas de sal y salsas?

Me encontré con una discusión en la que aprendí que lo que había estado haciendo no era, de hecho, eliminar las contraseñas, sino que las salpicaba, y desde entonces comencé a hacer ambas cosas con una función como:

hash_function($salt.hash_function($pepper.$password)) [multiple iterations]

Ignorar el algoritmo hash elegido (quiero que sea una discusión de sales & peppers y no de algoritmos específicos, pero estoy usando uno seguro), ¿es esta una opción segura o debería estar haciendo algo diferente? Para aquellos que no están familiarizados con los términos:

A sal es un valor generado aleatoriamente que generalmente se almacena con la cadena en la base de datos diseñada para hacer que sea imposible usar tablas hash para descifrar contraseñas. Como cada contraseña tiene su propia sal, todas deben ser forzadas brutalmente individualmente para descifrarlas; sin embargo, como la sal se almacena en la base de datos con el hash de contraseña, un compromiso de base de datos significa perder ambos.

A pimienta es un valor estático en todo el sitio que se almacena por separado de la base de datos (generalmente codificado en el código fuente de la aplicación) que se pretende que sea 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 de fuerza bruta.

¿Hay algo que me esté faltando y es la mejor opción para proteger la seguridad de mi usuario al utilizar mi salado y salpicar mis contraseñas? ¿Hay algún defecto de seguridad potencial para hacerlo de esta manera?

Nota: para el propósito de la discusión, supongamos 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.

Respuestas a la pregunta(4)

Su respuesta a la pregunta