Соль в PBKDF2 - Питон

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

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

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

1 ответ

Решение

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

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

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

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

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

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

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

См. Раздел " Формат и алгоритм " для pbkdf2_sha256 Docs.

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

Другие вопросы по тегам