Какие криптографические операции и библиотеки используются в 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), чтобы замедлить атаки методом перебора.
  • Управление ключами: Безопасное хранение и управление криптографическими ключами является критически важным.

Ответ 18+ 🔞

А, ну вот, криптография в питоне, блядь! Это ж как сходить в магазин за хлебушком, только вместо хлеба — шифры, а вместо сдачи — ключи, которые потеряешь и пиздец всему. Слушай, тут главное — не выёбываться и не пытаться самому придумать, как зашифровать, а то получится как у того чувака, который на коленке свой AES склепал, а потом охуел, когда всё расшифровали за пять минут.

Ну, смотри, какие есть варианты, чтобы не облажаться:

  1. hashlib (Это которое из коробки, стандартное):

    • Это, блядь, не для шифрования, а для превращения чего угодно в такую кашу, из которой обратно не собрать. Типа, взял пароль, перемолол в фарш — получил хеш. Идеально, чтобы проверять, не подменили ли файл, или чтобы пароли в базе хранить не в открытом виде, а то вдруг админ — пидарас шерстяной, и всем раздаёт логины.
    • Алгоритмы там: SHA256, SHA512, BLAKE2. MD5 тоже есть, но его использовать — это как мыть жопу грязной тряпкой: вроде помыл, а заразу занёс. Не надо так.
    • Зачем оно? Чтобы быстро проверить целостность или пароль захешировать так, чтобы даже сам чёрт не догадался, что там было.

    Вот, смотри, как пароль нормально перемолоть, чтобы не стыдно было:

    import hashlib
    import os
    
    def hash_password(password: str) -> bytes:
        """
        Делаем из пароля фарш с помощью PBKDF2-HMAC-SHA256.
        Возвращаем соль и сам фарш, склеенные вместе.
        """
        salt = os.urandom(16) # Генерируем случайную соль, 16 байт. Без соли — вообще никуда не годится.
        # А теперь сам процесс перемалывания. 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')}") # Должно быть True
    print(f"Verification failed: {verify_password(hashed_pw, 'wrongpassword')}") # А тут False, ебанашка
  2. cryptography (Это уже сторонняя, но охуенно крутая библиотека):

    • Вот это, блядь, настоящая кухня. Тут тебе и симметричное шифрование, и асимметричное, и подписи, и сертификаты — полный пакет, чтобы чувствовать себя хакером из фильма. Есть простые штуки вроде Fernet (для ленивых, но умных), а есть низкоуровневые примитивы, если хочешь всё контролировать до последнего бита.
    • Зачем оно? Когда нужно не просто фарш сделать, а полноценно зашифровать письмо, чтобы только адресат прочитал, или подписать документ цифровой подписью. Короче, для серьёзных дел.

    Вот пример, как шифровать по-простому, с помощью Fernet. Проще некуда:

    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 — хорошая цифра.
  • Ключи, сука, ключи! Весь этот цирк с шифрованием накрывается медным тазом, если ключ валяется в открытом репозитории на гитхабе или в конфиге рядом с кодом. Храни их как зеницу ока, в секретных хранилищах, в переменных окружения, где угодно, только не в plain text.