Шаг 51.
Основы языка Python.
Строки и двоичные данные. Шифрование строк

    На этом шаге мы рассмотрим средства, используемые для выполнения шифрования строк.

    Для шифрования строк предназначен модуль hashlib. Прежде чем использовать функции из этого модуля, необходимо подключить модуль с помощью инструкции:

  import hashlib

    Модуль предоставляет следующие функции: md5 (), sha1 (), sha224 (), sha256 (), sha384 () и sha512 (). В качестве необязательного параметра функциям можно передать шифруемую последовательность байтов. Пример:

>>> import hashlib
>>> h = hashlib.sha1(b"password")

    Передать последовательность байтов можно также с помощью метода update (). В этом случае объект присоединяется к предыдущему значению:

>>> h = hashlib.sha1()
>>> h.update(b"password")

    Получить зашифрованную последовательность байтов и строку позволяют два метода: digest () и hexdigest (). Первый метод возвращает значение, относящееся к типу bytes, а второй - строку, содержащую шестнадцатеричные цифры. Примеры:

>>> h = hashlib.sha1(b"password")
>>> h.digest()
b'[\xaaa\xe4\xc9\xb9??\x06\x82%\x0bl\xf83\x1b~\xe6\x8f\xd8'
>>> h.hexdigest()
'5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8'

    Наиболее часто применяемой является функция md5 (), которая шифрует строку с помощью алгоритма MD5. Эта функция используется для шифрования паролей, т. к. не существует алгоритма для дешифровки зашифрованных ей значений. Для сравнения введенного пользователем пароля с сохраненным в базе необходимо зашифровать введенный пароль, а затем произвести сравнение:

>>> import hashlib
>>> h = hashlib.md5(b"password")
>>> p = h.hexdigest()
>>> p # Пароль, сохраненный в базе
'5f4dcc3b5aa765d61d8327deb882cf99'
>>> h2 = hashlib.md5(b"password") # Пароль, введенный пользователем
>>> if p == h2.hexdigest(): print("Пароль правильный")

Пароль правильный

    Свойство digest_size хранит размер значения, генерируемого описанными ранее функциями шифрования, в байтах:

>>> h = hashlib.sha512(b"password")
>>> h.digest_size
64

    Python 3.4 поддерживает новый способ устойчивого к взлому шифрования паролей с помощью функции pbkdf2_hmac ():

  pbkdf2_hmac(<Основной алгоритм шифрования>, <Шифруемый пароль>, <"Соль">, 
    <Количество проходов шифрования>, dklen=None)

    В качестве основного алгоритма шифрования следует указать строку с наименованием этого алгоритма: "md5", "sha1", "sha224", "sha256", "sha384" и "sha512". Шифруемый пароль указывается в виде значения типа bytes. "Соль" - это особая величина типа bytes, выступающая в качестве ключа шифрования, - ее длина не должна быть менее 16 символов. Количество проходов шифрования следует указать достаточно большим (так, при использовании алгоритма SHA512 оно должно составлять 100000).


   Примечание. Кодирование данных с применением функции pbkdf2_hmac() отнимает очень много системных ресурсов и может занять значительное время, особенно на маломощных компьютерах.

    Последним параметром функции pbkdf2_hmac () можно указать длину результирующего закодированного значения в байтах - если она не задана или равна None, будет создано значение стандартной для выбранного алгоритма длины (64 байта для алгоритма SHA512). Закодированный пароль возвращается в виде величины типа bytes. Пример:

>>> import hashlib
>>> dk = hashlib.pbkdf2_hmac('sha512', b'1234567', b'saltsaltsaltsalt', 100000)
>>> dk
b"Sb\x85tc-\xcb@\xc5\x97\x19\x90\x94@\x9f\xde\x07\xa4p-\x83\x94\xf4\x94\x99\x07\xec\xfa\xf3
\xcd\xc3\x88jv\xd1\xe5\x9a\x119\x15/\xa4\xc2\xd3N\xaba\x02\xc0s\xc1\xd1\x0b\x86xj(\x8c>Mr'@\xbb"

    На следующем шаге мы приведем несколько примеров решения задач на строки.




Предыдущий шаг Содержание Следующий шаг