Вы используете не тот набор инструментов. Выберите простой веб-фреймворк, такой как web.py, и следуйте примерам.
Назначение соли - требовать регенерации радужной таблицы для каждого пароля. Если вы используете одну соль, хакеру / взломщику нужно всего лишь один раз восстановить радужную таблицу, и у него будут все ваши пароли. Но если вы генерируете случайный для каждого пользователя, он должен генерировать по одному для каждого пользователя. Намного дороже со стороны хакеров. Вот почему вы можете хранить соль в виде обычного текста, неважно, знает ли об этом хакер, если их больше одного.
Защита от неизвестности - это плохо, этому нас научила Microsoft.
The value of a salt lies in it being different for each user. You also need to be able to retrieve this non-unique value when you're re-creating the hashed value for comparison purposes.
If you store a single salt value that you use for every password, then you massively reduce the value of having a salt in the first place.
Урок, который я извлек из соли: разделяй и властвуй (безопасность)
В дополнение к В других ответах также стоит отметить, что злоумышленник может вычислить вашу соль так же, как и пароль: зная известный пароль (свой собственный), он может провести атаку грубой силы на возможные соли.