Как сравнить пароль обычного текста с хешированным паролем с помощью bcrypt?
Я хотел бы использовать bcrypt
для хэш-паролей, а затем проверить правильность введенного пароля.
Хеширование паролей легко:
import bcrypt
password = u'foobar'
password_hashed = bcrypt.hashpw(password, bcrypt.gensalt())
# then store password_hashed in a database
Как сравнить простой текстовый пароль с сохраненным хешем?
Ответы
Ответ 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
Ответ 4
Я не знаком с Python, но я думаю, что вы можете использовать:
public static логическое checkpw (открытый текст java.lang.String, хеширование java.lang.String)
# Check that an unencrypted password matches one that has
# previously been hashed.
if bcrypt.checkpw(plaintext, hashed):
print "It matches"
else:
print "It does not match"