Введение
Шифрование и криптографическая безопасность — краеугольный камень в цифровую эпоху. Хранение паролей, защита файлов, безопасная аутентификация и передача данных невозможны без надёжных криптографических инструментов. Библиотека 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
Пример комплексного потока
-
Генерация пары ключей (RSA)
-
Шифрование конфиденциальных данных
-
Подпись сообщения
-
Проверка подписи
-
Запись в файл 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 и безопасности. Её используют банки, хостинги, телекомы, госслужбы и финтех-стартапы. Если нужна криптографическая защита — начинать следует с этой библиотеки.