Языки программирования

Средства шифрования в Python

В Python не так уж много инструментов стандартной библиотеки, которые работают с шифрованием. В данной статье мы рассмотрим несколько библиотек для шифрования и научимся шифровать и расшифровывать строки.

1. Хеширование

Если вам нужно шифровать пароли, то для этого подойдет модуль стандартной библиотеки Python hashlib.
Он включает в себя безопасные алгоритмы хеширования FIPS, такие как SHA1, SHA224, SHA256, SHA384, а также SHA512 и MD5.
Python также поддерживает функции хеширования adler32 и crc32, но они содержатся в модуле zlib. Одно из самых популярных применений хеширования это хранение хеша пароля, вместо самого пароля.
Другой популярный случай, в котором применяется хеширование – это хеширование файла, с последующей отправкой файла и его хеша по отдельности. Получатель файла может запустить хеш в файле, чтобы убедиться в том, что файл соответствует отправленному хешу.
Существует метод быстрого создания хеша, мы рассмотрим его, когда создадим наш хеш sha512:
import hashlib

result = hashlib.sha1(b'hello').hexdigest()
print(result)

input()
# Будет выведено: aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
В данном примере мы создали наш экземпляр хеша и вызвали его метод дайджеста одновременно. Далее, мы выводим наш хеш, чтобы на него посмотреть.

Вывод ключа

У Python весьма ограниченная поддержка вывода ключа, встроенная в стандартную библиотеку. Фактически, единственный метод, предлагаемый hashlib это pbkdf2_hmac, который является основанной на пароле функцией вывода ключа PKCS#5.
Он использует HMAC в качестве своей псевдослучайной функцией. Вы можете использовать что-нибудь на подобии для хеширования вашего пароля, так как он поддерживает соль и итерации.
Например, если вы собираетесь использовать SHA-256, вам может понадобиться соль минимум в 16 битов и 100.000 итераций.
Соль — это просто случайные данные, которые вы используете в качестве дополнения в вашем хеше, с целью усложнения расшифровки вашего пароля. В целом, она защищает ваш пароль от словарных атак и рассчитанных заранее радужных таблиц. Давайте посмотрим на пример:
import binascii
import hashlib

dk = hashlib.pbkdf2_hmac(hash_name='sha256',
                         password=b'bad_password34',
                         salt=b'bad_salt',
                         iterations=100000)

result = binascii.hexlify(dk)
print(result)

input()
# Будет выведено: b'1a5abae9b195a4d1dbd2c79d9787841c2c68c39e507c3f26e89b2969eea8dac6'
Здесь мы создаем хеш SHA256 в пароле при помощи соли со 100,000 итераций. Конечно, SHA в буквальном смысле не рекомендуется для создания ключей паролей. Вместо этого, вам лучше использовать что-то вроде scrypt. Пакет bcrypt разработан специально для хеширования паролей.

2. RSA

RSA — криптографический алгоритм с открытым ключом. При создании приложения вы генерируете два ключа: публичный (открытый) и приватный (закрытый).
Открытый ключ передается всем желающим и заинтересованным. С его помощью можно зашифровать данные. А вот расшифровать можно только зная другой ключ из пары (т.е. закрытый).
Чтобы установить модуль RSA для Python необходимо прописать в командной строке (от имени администратора):
pip install rsa
Пример использования RSA:
import rsa
(pubkey, privkey) = rsa.newkeys(512)
message = b'Demo text'
 
# шифруем
crypto = rsa.encrypt(message, pubkey)
print(crypto)
print("\n")
#расшифровываем
message = rsa.decrypt(crypto, privkey)
print(message)

input()
# Будет выведено: 
# b'\x0e4\x91\xe8r\xa3\xe2`\xf7z\xffs\xf2\x80\xfb\x8c\xf2\x19R\xb7\x1f\x0c\x0f\xaf\xe5*o\xd2\xb7&]E\xa6\xa0b\xcc#\x1bv\xa2a\xe1iO#fs\xa8]\xc2\xf7\xc3\xe2s.s \x13|M\xd5P\xcb\x91'

# b'Demo text'

3. cryptography

Пакет cryptography нацелен на то, чтобы быть «криптографом для людей», равно как и библиотека requests является «HTTP для людей».
Суть в том, что вам нужно разработать простые криптографические рецепты которые и безопасны, и простые в использовании.
Чтобы установить модуль cryptography для Python необходимо прописать в командной строке (от имени администратора):
pip install cryptography
Cryptography установится совместно с несколькими зависимостями. С помощью модуля Fernet можно зашифровать текст. Рассмотрим пример:
from cryptography.fernet import Fernet

# Шифруем
cipher_key = Fernet.generate_key()
cipher = Fernet(cipher_key)
text = b'Message'
encrypted_text = cipher.encrypt(text)
print(encrypted_text)
print("\n")

# Дешифруем
decrypted_text = cipher.decrypt(encrypted_text)
print(decrypted_text)

input()
# Будет выведено:
b'gAAAAABeU57f6UhNhi8WtK11n5sj5MNcwl1JoTd_i8VaR1-74w5Ub0riQMMC6Ak5TSopFN-dCg4MRODSL-w2HD9RGKYfkhHTug=='

b'Message'
Модуль Fernet реализует простую в использовании схему аутентификации, которая использует симметричный алгоритм шифрования, который гарантирует, что каждое зашифрованное в нем сообщение не может быть использовано или прочитано без определенного вами ключа.

Для начала, нам нужно импортировать Fernet. Затем мы генерируем ключ. Далее мы создаем экземпляр нашего шифра Fernet при помощи нашего ключа. Теперь у нас есть шифр, который мы можем использовать для шифрования и расшифровки нашего сообщения.

Следующий шаг, это создание сообщения, достойного шифровки, с последующей его шифровкой при помощи метода encrypt.

Для расшифровки нашего сообщения, мы просто вызовем метод decrypt в нашем шифре и передадим зашифрованный текст. В результате мы получим текстовую байтовую строку нашего сообщения.
Самоучитель по Python