Могу ли я расшифровать хешированный пароль Bcrypt с помощью check_password_hash от werkzeug.security?

Можно ли расшифровать ранее хешированные пароли с помощью:

Bcrypt - $2b$12$

при использовании:

from werkzeug.security import generate_password_hash, check_password_hash

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

Возможно, я наивен.

Я зашифровал пароли так:

application = Flask(__name__)
bc = Bcrypt(application)
password=bc.generate_password_hash(data['password_input'])

Но хотелось бы расшифровать так:

application = Flask(__name__)
from werkzeug.security import generate_password_hash, check_password_hash
if check_password_hash(user.password, password):
    pass

Пример (фиктивный) хеш:

$2b$12$98WSJfIg.YkR/Bn469IX4OlOCJx.HMWKxR8NysSynGa8QHf/4rawq

Я бы использовал библиотеку Bcrypt, но мне не удалось заставить ее работать с Elastic Beanstalk из-за http://stackoverflow.com/questions/41854768/flask-bcrypt-attributeerror-module-object-has-no-attribute-ffi-deployed.


person archienorman    schedule 25.01.2017    source источник
comment
Нет, ты не можешь. В этом вся суть. Вы должны просто зашифровать входящий пароль и сравнить хэш с хэшем, который у вас есть.   -  person Suever    schedule 25.01.2017


Ответы (1)


Нет, ты не можешь этого сделать. В этом весь смысл использования Bcrypt для шифрования пароля. Если бы вы могли восстановить пароль из хэша, то любое нарушение вашей базы данных привело бы к тому, что учетные данные пользователей стали бы доступными, а хэш был бы не лучше, чем хранение пароля в виде открытого текста. Подробнее о хешировании паролей см. здесь.

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

import bcrypt
isSamePassword = bcrypt.hashpw(new_password, stored_hash)
person Suever    schedule 25.01.2017
comment
извините, возможно, я не был ясен в своем вопросе, сказав «расшифровать», что я просил, это то, что вы предложили. То есть я хочу взять пароль в открытом виде, хэшировать его, сравнить хэш с моим ранее сохраненным хэшем. - person archienorman; 25.01.2017
comment
но чтобы получить такой же хэш, я предполагаю, что мне нужно убедиться, что алгоритм хеширования bcrypt такой же, как хеш, который я создаю, используя werkzeug.security. Поймите, что это не идеальная ситуация, но вынужденная, поскольку Bcrypt не работает с AWS Beanstalk. - person archienorman; 25.01.2017
comment
@user3939059 user3939059 Да, требуется, чтобы функция хэширования, используемая для создания хэша и проверки хеша, была идентичной. Альтернативы нет. Почему это не работает с Beanstalk? - person Suever; 25.01.2017
comment
Хорошо спасибо. Проблема Beanstalk: AttributeError: 'module' object has no attribute 'ffi' - ссылка здесь: stackoverflow.com/questions/41854768/ - person archienorman; 25.01.2017
comment
@user3939059 user3939059 Хорошо, тогда другой вопрос заключается в том, где следует решать эту конкретную проблему, а не в этой. Это определенно должно работать, и это единственный способ сравнить пароли, как я сказал в этом ответе. Как я уже сказал здесь, невозможно получить пароль из хеш-значений, поэтому я считаю, что на этот вопрос дан ответ. - person Suever; 25.01.2017