Ответ
В Python для реализации криптографических операций используются как встроенные модули, так и сторонние библиотеки, обеспечивающие различные уровни сложности и безопасности.
Основные подходы и библиотеки:
-
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')}") -
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 склепал, а потом охуел, когда всё расшифровали за пять минут.
Ну, смотри, какие есть варианты, чтобы не облажаться:
-
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, ебанашка -
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.