реклама
Бургер менюБургер меню

Кеннет Рейтц – Автостопом по Python (страница 63)

18

Установите ее с помощью pip:

$ pip install pyOpenSSL

И импортируйте под именем OpenSSL. В этом примере показываются несколько доступных функций:

>>> import OpenSSL

>>>

>>> OpenSSL.crypto.get_elliptic_curve('Oakley-EC2N-3')

<Curve 'Oakley-EC2N-3'>

>>>

>>> OpenSSL.SSL.Context(OpenSSL.SSL.TLSv1_2_METHOD)

<OpenSSL.SSL.Context object at 0x10d778ef0>

Команда разработчиков pyOpenSSL поддерживает код примера (https://github.com/pyca/pyopenssl/tree/master/examples), который включает в себя генерацию сертификатов, способ начать использовать SSL вместо уже соединенного сокета, а также безопасный сервер XMLRPC.

PyNaCl и libnacl

Идея, лежащая в основе libsodium (http://bit.ly/introducing-sodium) (библиотеки-бэкенда, написанной на C, для PyNaCl и libnacl), заключается в том, чтобы намеренно не давать пользователям выбор — лишь лучшие варианты из доступных в их ситуации. Она не поддерживает полностью протокол TLS; если вы хотите использовать этот протокол по максимуму, выбирайте pyOpenSSL. Если вам требуется лишь устанавливать зашифрованные соединения с другими компьютерами, которыми вы управляете, или с выбранными вами протоколами и вы не хотите работать с OpenSSL, эта библиотека отлично подойдет[110].

PyNaCl произносится py-salt («пай-солт»), а libnacl — lib-salt («либ-солт»). Они обе созданы на основе библиотеки NaCl (salt) (https://nacl.cr.yp.to/).

Мы рекомендуем использовать PyNaCl (https://pypi.python.org/pypi/PyNaCl) вместо libnacl (https://libnacl.readthedocs.io/), поскольку за ней присматривает PyCA и вам не нужно отдельно устанавливать libsodium. Библиотеки, по сути, одинаковы: PyNaCl используют привязки CFFI для библиотек, написанных на C, а libnacl — ctypes (поэтому выбор библиотеки не имеет особого значения). Установите PyNaCl с помощью pip:

$ pip install PyNaCl

В докуменатции к PyNaCl по адресу https://pynacl.readthedocs.io/en/latest/ есть и примеры.

Cryptography

Cryptography (https://cryptography.io/en/latest/) предоставляет рецепты и примитивы для шифрования. Поддерживает Python версий 2.6–2.7 и 3.3+, а также PyPy. PyCA рекомендует в большинстве случаев пользоваться высокоуровневым интерфейсом pyOpenSSL.

Cryptography состоит из двух уровней: рецептов и опасных материалов (hazardous materials, hazmat). Уровень рецептов предоставляет простой API для выполнения качественного симметричного шифрования, а уровень hazmat — низкоуровневые криптографические примитивы. Установите ее с помощью pip:

$ pip install cryptography

В этом примере используется высокоуровневый рецепт симметричного шифрования — единственная высокоуровневая функция этой библиотеки:

from cryptography.fernet import Fernet

key = Fernet.generate_key()

cipher_suite = Fernet(key)

cipher_text = cipher_suite.encrypt(b" A really secret message.")

plain_text = cipher_suite.decrypt(cipher_text)

PyCrypto

PyCrypto (https://www.dlitz.net/software/pycrypto/) предоставляет безопасные хэш-функции, а также разнообразные алгоритмы шифрования. Поддерживает версии Python 2.1+ и Python 3+. Поскольку код, написанный на C, является пользовательским, PyCA осторожно работайте с библиотекой (но она использовалась де-факто для решения задач, связанных с шифрованием, многие годы, поэтому вы можете встретить ее в более старом коде). Установите ее с помощью pip:

$ pip install pycrypto

Использовать ее можно так:

from Crypto.Cipher import AES

# Шифрование

encryption_suite = AES.new('This is a key123', AES.MODE_CBC,

'This is an IV456')

cipher_text = encryption_suite.encrypt("A really secret message.")

# Дешифрование

decryption_suite = AES.new('This is a key123', AES.MODE_CBC,

'This is an IV456')

plain_text = decryption_suite.decrypt(cipher_text)

bcrypt

Если вы хотите применять алгоритм bcrypt (https://en.wikipedia.org/wiki/Bcrypt) для ваших паролей, задействуйте эту библиотеку. Тем, кто раньше пользовался py-bcrypt, должно быть нетрудно перейти на нее, поскольку библиотеки совместимы. Установите ее с помощью pip:

pip install bcrypt

Она имеет всего две функции: bcrypt.hashpw() и bcrypt.gensalt(). Последняя позволяет выбирать количество итераций — чем больше итераций, тем медленнее работает алгоритм (по умолчанию задается их разумное количество). Рассмотрим пример:

>>> import bcrypt

>>>>

>>> password = bytes('password', 'utf-8')

>>> hashed_pw = bcrypt.hashpw(password, bcrypt.gensalt(14))

>>> hashed_pw

b'$2b$14$qAmVOCfEmHeC8Wd5BoF1W.7ny9M7CSZpOR5WPvdKFXDbkkX8rGJ.e'

Сохраняем хэшированный пароль:

>>> import binascii

>>> hexed_hashed_pw = binascii.hexlify(hashed_pw)

>>> store_password(user_id=42, password=hexed_hashed_pw)

Когда приходит время проверять пароль, используйте хэшированный пароль в качестве второго аргумента функции bcrypt.hashpw() следующим образом:

>>> hexed_hashed_pw = retieve_password(user_id=42)

>>> hashed_pw = binascii.unhexlify(hexed_hashed_pw)

>>>

>>> bcrypt.hashpw(password, hashed_pw)

b'$2b$14$qAmVOCfEmHeC8Wd5BoF1W.7ny9M7CSZpOR5WPvdKFXDbkkX8rGJ.e'

>>>

>>> bcrypt.hashpw(password, hashed_pw) == hashed_pw

True

Глава 10. Манипуляции с данными