Храните пароль + соль как хеш и соль. Посмотрите, как это делает Django: базовые документы и source .
В БД они хранят <type of hash>$<salt>$<hash>
в одном поле char. Вы также можете хранить три части в отдельных полях.
Функция для установки пароля:
def set_password(self, raw_password):
import random
algo = 'sha1'
salt = get_hexdigest(algo, str(random.random()), str(random.random()))[:5]
hsh = get_hexdigest(algo, salt, raw_password)
self.password = '%s$%s$%s' % (algo, salt, hsh)
get_hexdigest - это просто оболочка для некоторых алгоритмов хеширования. Вы можете использовать hashlib для этого. Что-то вроде hashlib.sha1('%s%s' % (salt, hash)).hexdigest()
И функция проверки пароля:
def check_password(raw_password, enc_password):
"""
Returns a boolean of whether the raw_password was correct. Handles
encryption formats behind the scenes.
"""
algo, salt, hsh = enc_password.split('$')
return hsh == get_hexdigest(algo, salt, raw_password)