Соль в PBKDF2 — Python

Я только узнаю о защите пароля при разработке с использованием MySQL и Python, следуя это руководство.

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

Правда, при использовании PBKDF2 (через функцию passlib.hash.sha256_crypt()) я не могу задать свою соль, только ее размер. Итак, как я могу перефразировать пароль, используя одну и ту же соль, чтобы я мог сравнить оба?


person hiperbolt    schedule 22.09.2016    source источник
comment
hashlib.pbkdf2_hmac() принимает соль. Какую функцию вы используете?   -  person Martijn Pieters    schedule 22.09.2016
comment
Я использую pbkdf2_sha256.encrypt, следуя инструкциям на cyberciti.biz /учебники по Python/   -  person hiperbolt    schedule 22.09.2016
comment
Эта реализация также требует соли. Если он не указан, он создается для вас.   -  person Martijn Pieters    schedule 22.09.2016
comment
Могу ли я просто сделать pbkdf2_sha256.encrypt(arg, arg, salt='blabla235')?   -  person hiperbolt    schedule 22.09.2016
comment
Обратите внимание, что возвращаемая строка содержит соль, поэтому вам не нужно создавать ее заранее. Строка имеет форму $<type>$rounds=<rounds>$salt$hash, поэтому, если вы хотите хранить хэш отдельно, вы можете это сделать.   -  person Martijn Pieters    schedule 22.09.2016
comment
Да, в документации определенно указано, что аргумент salt принимается. pbkdf2_sha256.encrypt("password", rounds=200000, salt='blabla235')   -  person Martijn Pieters    schedule 22.09.2016
comment
TypeError: соль должна быть байтами, а не строкой   -  person hiperbolt    schedule 22.09.2016
comment
Казалось бы, соль — это то же самое, что и соль_размер.   -  person hiperbolt    schedule 22.09.2016
comment
Итак, передайте в байтах: b'blabla235'. Нет, salt_size определяет, насколько большая соль генерируется для вас. Это не то же самое, что salt.   -  person Martijn Pieters    schedule 22.09.2016
comment
это работает, да, я думаю, что просто конвертировать было достаточно. Большое спасибо! Пожалуйста, ответьте с ответом, чтобы я мог проверить его правильность   -  person hiperbolt    schedule 22.09.2016
comment
Сначала отредактируйте свой вопрос, чтобы было ясно, какую функцию и учебник вы использовали. В его нынешнем виде он не соответствует требованиям нашего вопроса.   -  person Martijn Pieters    schedule 22.09.2016
comment
Хорошо, я должен отправить вам сообщение, как только оно будет исправлено?   -  person hiperbolt    schedule 22.09.2016
comment
Это было бы полезно :-) У меня возможно нет времени сегодня вечером, но я сделаю это завтра утром.   -  person Martijn Pieters    schedule 22.09.2016


Ответы (1)


Интерфейс Passlib Password Hash позволяет установить соль < em>размер, или само значение salt. Из документации по pbkdf2_sha256:

  • salt (байты) Дополнительные байты соли. Если указано, длина должна быть между 0-1024 байт. Если не указано, будет автоматически сгенерирована 16-байтовая соль (рекомендуется).

  • salt_size (int) — необязательное количество байтов для использования при автоматическом создании новых солей. По умолчанию 16 байт, но может быть любым значением от 0 до 1024.

так что вы можете установить свою собственную предварительно созданную соль:

>>> from passlib.hash import pbkdf2_sha256
>>> pbkdf2_sha256.hash("password", rounds=200000, salt=b'spamhameggs')
'$pbkdf2-sha256$200000$c3BhbWhhbWVnZ3M$WL9OLVcb3f7HqHeNT./kCJeunydLCi4JykzEuAdewcI'

Однако обратите внимание, что соль является частью возвращаемой строки. Строка содержит не только результирующий хэш, но также алгоритм, количество использованных раундов и использованную соль, разделенную символом $. Соль закодирована в модифицированную форму base64< /а>. Вы можете убедиться в этом, снова расшифровав строку c3BhbWhhbWVnZ3M::

>>> from passlib.utils.binary import ab64_decode
>>> ab64_decode(b'c3BhbWhhbWVnZ3M')
b'spamhameggs'

См. Формат и алгоритм для pbkdf2_sha256 документов.

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

Вы можете прочитать руководство Passlib по хешированию паролей, который включает в себя описание того, как хэшировать пароли при сохранении в базе данных и как их снова проверять (например, с использованием pdkdf2_sha256.verify(password_user_entered, hash_stored_in_database)), что охватывает именно эту область.

person Martijn Pieters    schedule 23.09.2016