Какие криптографические операции и библиотеки используются в Python?

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

Ответ

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

Основные подходы и библиотеки:

  1. hashlib (Стандартная библиотека):

    • Предназначен для создания криптографических хешей (односторонних функций).
    • Используется для проверки целостности данных, хранения паролей (в сочетании с солью и функцией растяжения ключа, такой как PBKDF2).
    • Поддерживает алгоритмы: SHA256, SHA512, MD5 (не рекомендуется для безопасности), BLAKE2 и другие.
    • Почему: Для быстрой проверки целостности и безопасного хранения паролей без возможности их восстановления.

    Пример хеширования пароля с PBKDF2:

    import hashlib
    import os
    
    def hash_password(password: str) -> bytes:
        """
        Хеширует пароль с использованием PBKDF2-HMAC-SHA256.
        Возвращает соль и хеш, объединенные в байтовую строку.
        """
        salt = os.urandom(16) # Генерируем случайную соль (16 байт)
        # PBKDF2-HMAC-SHA256 с 100,000 итераций
        key = hashlib.pbkdf2_hmac(
            'sha256',
            password.encode('utf-8'), # Пароль должен быть в байтах
            salt,
            100000,
            dklen=32 # Длина производного ключа
        )
        return salt + key
    
    def verify_password(stored_password_hash: bytes, provided_password: str) -> bool:
        """
        Проверяет предоставленный пароль на соответствие сохраненному хешу.
        """
        salt = stored_password_hash[:16]
        stored_key = stored_password_hash[16:]
        new_key = hashlib.pbkdf2_hmac(
            'sha256',
            provided_password.encode('utf-8'),
            salt,
            100000,
            dklen=32
        )
        return new_key == stored_key
    
    # Использование
    hashed_pw = hash_password("mysecretpassword")
    print(f"Hashed password: {hashed_pw.hex()}")
    print(f"Verification successful: {verify_password(hashed_pw, 'mysecretpassword')}")
    print(f"Verification failed: {verify_password(hashed_pw, 'wrongpassword')}")
  2. cryptography (Сторонняя библиотека):

    • Мощная и безопасная библиотека, рекомендованная для большинства криптографических задач, требующих шифрования, дешифрования, цифровых подписей, работы с сертификатами и т.д.
    • Предоставляет высокоуровневые "рецепты" (Fernet для симметричного шифрования) и низкоуровневые примитивы (AES, RSA, ECC, хэши, HMAC).
    • Почему: Для реализации сложных криптографических протоколов, безопасного обмена данными, управления ключами и работы с асимметричной криптографией.

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

    from cryptography.fernet import Fernet
    
    # Генерация ключа (должен быть сохранен безопасно)
    key = Fernet.generate_key()
    f = Fernet(key)
    
    # Шифрование данных
    message = b"My super secret data"
    encrypted_message = f.encrypt(message)
    print(f"Encrypted: {encrypted_message}")
    
    # Дешифрование данных
    decrypted_message = f.decrypt(encrypted_message)
    print(f"Decrypted: {decrypted_message.decode()}")

Важные аспекты:

  • Никогда не реализуйте криптографические алгоритмы самостоятельно, если вы не являетесь экспертом в этой области. Всегда используйте проверенные библиотеки.
  • Соль и итерации: При хешировании паролей всегда используйте уникальную соль для каждого пароля и достаточное количество итераций (например, 100,000 для PBKDF2), чтобы замедлить атаки методом перебора.
  • Управление ключами: Безопасное хранение и управление криптографическими ключами является критически важным.