Cryptography – работа с шифрованием

онлайн тренер по питону
Онлайн-тренажер Python 3 для начинающих

Теория без воды. Задачи с автоматической проверкой. Подсказки на русском языке. Работает в любом современном браузере.

начать бесплатно

Введение

Шифрование и криптографическая безопасность — краеугольный камень в цифровую эпоху. Хранение паролей, защита файлов, безопасная аутентификация и передача данных невозможны без надёжных криптографических инструментов. Библиотека Cryptography в Python — одно из самых популярных решений для реализации как симметричных, так и асимметричных методов защиты.

Cryptography предоставляет высокий уровень API для повседневных задач (шифрование, расшифровка, подпись, хэширование) и низкоуровневый доступ к primitives (blowfish, chacha20, rsa, dsa, ec и др.). В статье рассмотрим теорию, методы, примеры, практику, уязвимости, а также как и зачем использовать каждый компонент библиотеки.

Основная часть

Установка

pip install cryptography

Архитектура Cryptography

  • High-Level Recipes — удобные функции для частых задач (Fernet, key generation)

  • Low-Level Primitives — контроль над криптографией: padding, ciphers, MACs, key derivation

  • Поддержка OpenSSL и собственных C-биндингов для скорости


Симметричное шифрование (Fernet)

Fernet обеспечивает безопасное AES-шифрование с проверкой подлинности (authenticity).

Генерация ключа:

from cryptography.fernet import Fernet
key = Fernet.generate_key()

Сохранение ключа:

with open("secret.key", "wb") as f:
    f.write(key)

Шифрование:

f = Fernet(key)
token = f.encrypt(b"секретные данные")

Расшифровка:

original = f.decrypt(token)

Асимметричное шифрование

RSA: генерация пары ключей

from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization

private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
public_key = private_key.public_key()

Сериализация:

pem = private_key.private_bytes(...)
pem_pub = public_key.public_bytes(...)

Шифрование:

from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes

ciphertext = public_key.encrypt(
    b"секрет",
    padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None)
)

Расшифровка:

plaintext = private_key.decrypt(ciphertext, ...)

Хэширование данных

Простое хэширование:

from cryptography.hazmat.primitives import hashes

digest = hashes.Hash(hashes.SHA256())
digest.update(b"message")
final_hash = digest.finalize()

HMAC:

from cryptography.hazmat.primitives import hmac
h = hmac.HMAC(key, hashes.SHA256())
h.update(b"auth data")
h.finalize()

Подпись и верификация

Подпись RSA:

signature = private_key.sign(b"message", padding.PSS(...), hashes.SHA256())

Проверка:

public_key.verify(signature, b"message", padding.PSS(...), hashes.SHA256())

Генерация ключей и KDF

PBKDF2:

from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
kdf = PBKDF2HMAC(algorithm=hashes.SHA256(), length=32, salt=b"salt", iterations=100_000)
key = kdf.derive(b"password")

Проверка ключа:

kdf.verify(b"password", key)

ECC и Ed25519

from cryptography.hazmat.primitives.asymmetric import ed25519
key = ed25519.Ed25519PrivateKey.generate()
signature = key.sign(b"message")
key.public_key().verify(signature, b"message")

Утилиты сериализации и хранения

  • PEM / DER

  • EncryptedPrivateKeyInfo

  • PasswordProtected PEM


Пример комплексного потока

  1. Генерация пары ключей (RSA)

  2. Шифрование конфиденциальных данных

  3. Подпись сообщения

  4. Проверка подписи

  5. Запись в файл PEM


Ошибки и безопасность

  • Никогда не используйте eval() на расшифрованных данных

  • Не передавайте пароли в логах

  • Используйте random salt

  • Ограничивайте размер и TTL токенов


Реальные кейсы

  • Хранилища токенов авторизации

  • Безопасный обмен файлами между микросервисами

  • Электронная подпись для документов

  • Защита веб-сессий и cookies


Сравнение с другими библиотеками

Библиотека Уровень Симметрия Ассиметрия Примитивы Использование
cryptography Высокий Да Да Много Стандартизовано
pycrypto Средний Частично Частично Ограничено Устарело
pyca/pyopenssl Средний TLS-ориент. Нет Да Узкая ниша
 

Полный список функций и свойств библиотеки cryptography с описанием, сгруппированных по категориям

Генерация и управление ключами

Функция Описание
Fernet.generate_key() Генерирует симметричный ключ (base64-строка) для шифрования Fernet.
rsa.generate_private_key() Генерация приватного RSA-ключа.
ec.generate_private_key() Генерация ключа на эллиптической кривой (ECC).
dsa.generate_private_key() Генерация DSA-ключа для цифровой подписи.
x25519.X25519PrivateKey.generate() Генерация X25519-ключа для обмена ключами.
ed25519.Ed25519PrivateKey.generate() Генерация Ed25519-ключа для подписей.
serialization.load_pem_private_key(data, password) Загрузка приватного ключа из PEM-формата.
serialization.load_pem_public_key(data) Загрузка публичного ключа.
key.private_bytes(...) Сохранение приватного ключа в PEM/DER формате.
key.public_bytes(...) Сохранение публичного ключа.

Симметричное шифрование (Fernet)

Функция Описание
Fernet(key) Создаёт объект шифрования с данным ключом.
fernet.encrypt(data) Шифрует данные, возвращает токен в base64.
fernet.decrypt(token) Расшифровывает токен, проверяет HMAC и срок жизни.

Асимметричное шифрование и подписи

Функция Описание
public_key.encrypt(data, padding) Шифрует данные публичным ключом.
private_key.decrypt(ciphertext, padding) Расшифровывает приватным ключом.
private_key.sign(data, padding, algorithm) Подписывает сообщение.
public_key.verify(signature, data, padding, algorithm) Проверяет подпись.

Хеширование и MAC

Функция Описание
hashes.Hash(algorithm) Создаёт объект хеша.
digest.update(data) Добавляет данные к хешу.
digest.finalize() Завершает и возвращает результат.
hmac.HMAC(key, algorithm) Создаёт HMAC-объект.
h.update(data) Добавляет данные.
h.finalize() Получает MAC.
h.verify(signature) Проверяет правильность подписи.

Производные ключи (KDF)

Функция Описание
PBKDF2HMAC(...) Генерация ключа из пароля (на основе PBKDF2).
Scrypt(...) Производит ключ с защитой от атак по времени и памяти.
HKDF(...) Расширяет короткий секрет в длинный ключ.
kdf.derive(password) Получение ключа из пароля.
kdf.verify(password, key) Проверка корректности пароля по ключу.

Симметричное шифрование вручную (AES, ChaCha20, GCM)

Функция Описание
Cipher(algorithm, mode) Создаёт шифр.
cipher.encryptor() Возвращает объект шифрования.
cipher.decryptor() Возвращает объект расшифровки.
encryptor.update(data) Добавляет данные к шифрованию.
encryptor.finalize() Завершает процесс.

Работа с сертификатами (X.509)

Функция Описание
x509.CertificateBuilder() Построение сертификата вручную.
x509.load_pem_x509_certificate(data) Загрузка сертификата из PEM.
x509.NameAttribute(NameOID, value) Указание имени владельца.
cert.public_bytes(encoding) Экспорт сертификата.
x509.random_serial_number() Генерация серийного номера.

Вспомогательные операции

Функция Описание
os.urandom(n) Генерация криптографически стойких случайных байт.
constant_time.bytes_eq(a, b) Безопасное сравнение байт.

 


Заключение

Cryptography — это промышленный стандарт для безопасной криптографии в Python. Она предлагает как простой API, так и продвинутые инструменты, способные покрыть 90% криптозадач в вебе, DevOps, IoT и безопасности. Её используют банки, хостинги, телекомы, госслужбы и финтех-стартапы. Если нужна криптографическая защита — начинать следует с этой библиотеки.