На этом шаге мы рассмотрим средства, используемые для выполнения шифрования строк.
Для шифрования строк предназначен модуль 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 () можно указать длину результирующего закодированного значения в байтах - если она не задана или равна 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"
На следующем шаге мы приведем несколько примеров решения задач на строки.