Как классифицировать инструменты для шифрования в Python?

«Как классифицировать инструменты для шифрования в Python?» — вопрос из категории Безопасность, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Библиотеки для криптографии в Python можно классифицировать по уровню абстракции и назначению.

1. Встроенные модули (для хеширования и генерации токенов)

Эти модули не предназначены для шифрования данных, но являются основой для многих задач безопасности.

  • hashlib: Предоставляет интерфейс к алгоритмам безопасного хеширования (SHA-256, SHA-512, MD5). Используется для проверки целостности данных и хранения паролей.
  • hmac: Реализует HMAC (Hash-based Message Authentication Code), который используется для одновременной проверки целостности и подлинности сообщения.
  • secrets: Предназначен для генерации криптографически стойких случайных чисел, паролей и токенов.

2. Высокоуровневые библиотеки (рекомендуемый выбор)

Эти библиотеки предоставляют простые и безопасные API для решения большинства стандартных задач шифрования.

  • cryptography: Де-факто стандарт для криптографии в Python. Содержит как высокоуровневые рецепты (например, Fernet для симметричного шифрования), так и низкоуровневые криптографические примитивы (AES, RSA).
  • PyNaCl: Python-обертка над библиотекой libsodium. Предоставляет современный и простой в использовании API для сетевой и криптографической работы.

3. Низкоуровневые библиотеки (для специфических задач)

Эти библиотеки дают прямой доступ к широкому спектру криптографических алгоритмов, но требуют от разработчика глубоких знаний для безопасного использования.

  • PyCryptodome: Активный форк старой библиотеки PyCrypto. Содержит реализации множества как современных, так и устаревших алгоритмов.

Пример симметричного шифрования с cryptography:

Для большинства задач рекомендуется использовать высокоуровневый API Fernet, который обеспечивает шифрование и аутентификацию данных.

from cryptography.fernet import Fernet

# 1. Сгенерировать ключ (делается один раз, хранится в секрете)
key = Fernet.generate_key()

# 2. Создать экземпляр шифра с ключом
cipher_suite = Fernet(key)

# 3. Зашифровать данные (должны быть в байтах)
secret_message = b"This is a highly confidential message."
encrypted_message = cipher_suite.encrypt(secret_message)

# 4. Расшифровать данные
decrypted_message = cipher_suite.decrypt(encrypted_message)

print(f"Original: {decrypted_message.decode()}")