Как сравнить простой текстовый пароль с хешированным паролем, используя bcrypt? - PullRequest
35 голосов
/ 05 марта 2012

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

Легко хэшировать пароли:

import bcrypt

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

# then store password_hashed in a database

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

Ответы [ 4 ]

59 голосов
/ 21 октября 2012

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

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

>>> import bcrypt
>>> salt = bcrypt.gensalt()
>>> hashed = bcrypt.hashpw('secret', salt)
>>> hashed.find(salt)
0
>>> hashed == bcrypt.hashpw('secret', hashed)
True
>>>
14 голосов
/ 03 мая 2012

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

#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/

5 голосов
/ 05 марта 2012

Позже, скажем, у вас есть пароль для ввода пользователя 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 голосов
/ 17 мая 2014

Я не знаком с Python, но думаю, вы можете использовать:
public static логическое checkpw (открытый текст java.lang.String, java.lang.String hashed)

# 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"
...