2016-09-22 5 views
2

Я просто узнаю о защите пароля при разработке с использованием MySQL и Python, после this tutorial.Соль в PBKDF2 - Python

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

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

+0

['hashlib.pbkdf2_hmac()'] (https://docs.python.org/3/library/hashlib.html#hashlib.pbkdf2_hmac) принимает соль. Какую функцию вы используете? –

+0

Я использую pbkdf2_sha256.encrypt, следуя руководству в http://www.cyberciti.biz/python-tutorials/securely-hash-passwords-in-python/ – hiperbolt

+0

Это [реализация] (https://pythonhosted.org/passlib /lib/passlib.hash.pbkdf2_digest.html#passlib.hash.pbkdf2_sha256) также принимает соль. Если не указано, для вас создается один. –

ответ

1

Passlib Password Hash interface либо позволяет установить соль размера, или значения самого salt. Из documentation on pbkdf2_sha256:

  • salt (bytes) Optional salt bytes. If specified, the length must be between 0-1024 bytes. If not specified, a 16 byte salt will be autogenerated (this is recommended).

  • salt_size (int) – Optional number of bytes to use when autogenerating new salts. Defaults to 16 bytes, but can be any value between 0 and 1024.

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

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

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

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

Смотрите раздел Format & Algorithmpbkdf2_sha256 для документации.

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

+0

Спасибо за редактирование вопросов и ответов. Извините, я не редактировал его, у меня не было времени :( – hiperbolt