Подтвердить что ты не робот

Как сравнить пароль обычного текста с хешированным паролем с помощью bcrypt?

Я хотел бы использовать bcrypt для хэш-паролей, а затем проверить правильность введенного пароля.

Хеширование паролей легко:

import bcrypt

password = u'foobar'
password_hashed = bcrypt.hashpw(password, bcrypt.gensalt())

# then store password_hashed in a database

Как сравнить простой текстовый пароль с сохраненным хешем?

4b9b3361

Ответ 1

С py-bcrypt вам не нужно отдельно хранить соль: bcrypt хранит соль в хеше.

Вы можете просто использовать хеш в качестве соли, а соль хранится в начале хеша.

>>> import bcrypt
>>> salt = bcrypt.gensalt()
>>> hashed = bcrypt.hashpw('secret', salt)
>>> hashed.find(salt)
0
>>> hashed == bcrypt.hashpw('secret', hashed)
True
>>>

Ответ 2

В документации не упоминается сохранение соли, она говорит, что вам просто нужно:

#Initial generation
hashed = bcrypt.hashpw(password, bcrypt.gensalt())
#Store hashed in your db

#Load hashed from the db and check the provided password
if bcrypt.hashpw(password, hashed) == hashed:
    print "It matches"
else:
    print "It does not match"

http://www.mindrot.org/projects/py-bcrypt/

Ответ 3

Позже, скажем, у вас есть пароль пользователя user_pass. Вы также можете использовать хэш, а затем сравнить хэш с сохраненным хешем, и если они совпадут, то исходные пароли также совпадают.

Обратите внимание, что bcrypt автоматически сохраняет значение соли как часть хэшированного пароля, так что вы можете использовать его, когда вы также хотите использовать будущий ввод.

Первый раз:

import bcrypt

password = u'foobar'
salt = bcrypt.gensalt()
password_hashed = bcrypt.hashpw(password, salt)

# store 'password_hashed' in a database of your choosing

Позже:

import bcrypt
password = something_that_gets_input()

stored_hash = something_that_gets_this_from_the_db()

if bcrypt.hashpw(password, stored_hash) == stored_hash:
    # password matches