Нет необходимости выполнять хеширование в базе данных. Если вы основываете свою соль на чем-то вроде имени пользователя, которое может быть определено без доступа к хешированному паролю, это так же безопасно, как на уровне приложения:
password_hash = sha256(user_name + password)
user_id = query("SELECT id FROM user WHERE name=? and password_hash=?",
user_name, password_hash).first()
Или вы можете проверить имя пользователя и пароль в два отдельных шага и использовать идентификатор пользователя в качестве соли:
user_id, password_hash = query("SELECT id, password_hash FROM user WHERE name=?",
user_name).first()
if password_hash != sha256(user_id + password):
raise Exception("authentication failed")