Mi respuesta va a diferir de todos los demás. Tom Leek y Xander brindaron una buena perspectiva, por lo que aquí va mi respuesta a tu pregunta inicial, ampliando este comentario tuyo:
" No quiero almacenar la sal en una base de datos que podría estar
comprometido: eso anula el propósito de la salazón, ¿no? "
Sí, y no. Si alguien comprometió su base de datos, tiene cosas más importantes de las que preocuparse. El mero hecho de llegar tan lejos abre el potencial para olfatear el cable, donde si no se usa el cifrado, los datos son visibles antes de ser cifrados y metidos en una base de datos.
Las sales protegen porque agregan una capa para contrarrestar el agrietamiento. Un cracker necesita un hash de contraseña y un salt para producir algo que se pueda comparar con un hash conocido para encontrar la contraseña correcta. La mayoría de los cambios de salazón, de lo contrario, si esto ocurriera, la salada sería inútil:
User1 (password) [ kitten + your_static_salt = thundercat ]
User2 (password) [ kitten + your_static_salt = thundercat ]
En las obras teatrales anteriores, dos usuarios han elegido la palabra "gatito" como su contraseña que se utiliza para producir el resultado de "thundercat". Si esto es cierto, la porción de salazón es algo inútil. Si está utilizando password_hash de PHP, el salt se genera aleatoriamente para usted, el resultado sería el siguiente (por supuesto, minimizado para mayor claridad):
User1 (password) [ kitten + password_hash = thundercat ]
User2 (password) [ kitten + password_hash = uppercut ]
En lo anterior, vemos la misma contraseña, el password_hash de PHP cambia la sal cada vez. No hay necesidad de reinventar las ruedas aquí, ya que tendrías que hacer algunas inmersiones profundas en crypt () para entenderlo. Si usted es realmente interesado en el uso de sal y la seguridad de las contraseñas, eche un vistazo a phpass del Diseñador Solar Sin embargo, cuando dices que te preocupa que alguien haya comprometido la propia db, esto cambia el alcance de lo que podría hacer un atacante sin siquiera tener que descifrar las contraseñas.