Сообщить об ошибке.

Хеширование паролей модулем hashlib в Python

Функции хеширования паролей

Алгоритмы получения ключей предназначены для безопасного хеширования паролей. Наивные алгоритмы, такие как hashlib.sha1(password), не защищены от атак методом перебора. Хорошая функция хеширования пароля должна быть настраиваемой, медленной и содержать соль.

Содержание:


hashlib.pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None):

Функция hashlib.pbkdf2_hmac() обеспечивает основанную на пароле функцию извлечения ключей PKCS#5. Она использует HMAC в качестве псевдослучайной функции.

Атрибут hash_name - это строковое имя желаемого алгоритма хеширования для HMAC, например 'sha1' или 'sha256'.

Атрибуты пароль password и соль salt интерпретируются как буферы байтов. Приложения должны ограничивать допустимую длину пароля password например до 1024 байт. Соль salt должна составлять около 16 или более байтов из правильного источника, например os.urandom().

Количество итераций iterations следует выбирать на основе алгоритма хеширования и вычислительной мощности сервера приложения. По состоянию на 2018 год предлагается не менее 100.000 итераций для алгоритма хеширования SHA-256.

Атрибут dklen это требуемая длина получаемого ключа. Если dklen равен None, тогда возвращается полный размер хеша указанного алгоритма в аргументе hash_name, например для SHA-512 размер составит 64.

>>> import hashlib
>>> password = 'Pa$$w0rD'.encode()
>>> salt = 'Ваша соль'.encode()
>>> dk = hashlib.pbkdf2_hmac('sha256', password, salt, 100000)
>>> dk.hex()
>>> '44b5d206893fc278c9ad36ab6225c36d3ba78fb09f56c8db971baad1dd599601'

Примечание.
Быстрая реализация hashlib.pbkdf2_hmac доступна в OpenSSL. Реализация Python использует встроенную версию модуля hmac, что примерно в три раза медленнее, при этом Python GIL не запускается.

hashlib.scrypt(password, *, salt, n, r, p, maxmem=0, dklen=64):

Функция hashlib.scrypt() обеспечивает получение безопасного хеша на основе пароля password, как определено в RFC 7914.

Атрибуты пароль password и соль salt интерпретируются как буферы байтов. Приложения должны ограничивать допустимую длину пароля password например до 1024 байт. Соль salt должна составлять около 16 или более байтов из правильного источника, например os.urandom().

Остальные атрибуты:

  • n - это коэффициент стоимости процессор/память,
  • r - размер блока,
  • p - коэффициент распараллеливания,maxmem - ограничивает память, для OpenSSL 1.1.0 по умолчанию равен 32 МБ,dklen - длина полученного ключа.

Функция hashlib.scrypt() доступна при наличии в системе установленной библиотеки OpenSSL 1.1+

>>> import hashlib
>>> password = 'Pa$$w0rD'.encode()
>>> salt = 'Ваша соль'.encode()
>>> dk = hashlib.scrypt(password, salt=salt, n=8, r=512, p=4, dklen=32)
>>> dk.hex()
'8dd0d1198f2c56acf1406c465916c804b0fcc5e1a2f98c7af8566926507b7f01'