Основы криптографии: хеширование и безопасная случайность
Правильно применяйте криптографические примитивы стандартной библиотеки Python — и знайте их границы
hashlib, hmac и secrets. Навык не в том, чтобы писать криптографию, — а в том, чтобы выбрать нужный примитив и применить его без классических ошибок (использование random для безопасности, хранение сырых хешей как паролей или сравнение секретов через ==).
- различать хеширование, шифрование и кодирование и выбирать нужное,
- вычислять хеши контента через
hashlib, включая большие файлы, читаемые блоками, - аутентифицировать сообщения через
hmacи сравнивать секреты за постоянное время, - генерировать безопасные токены и случайные значения через
secretsвместоrandom, - хранить пароли с помощью соли и медленной функции формирования ключа (scrypt / PBKDF2),
- объяснить, почему нельзя изобретать собственную криптографию.
1. Три понятия, которые путают: хеширование, шифрование, кодирование
Прежде чем трогать API, зафиксируйте модель в голове. Эти три операции похожи (байты на входе, байты на выходе), но решают совершенно разные задачи.
| Операция | Обратима? | Нужен ключ? | Назначение |
|---|---|---|---|
| Кодирование (base64, hex, UTF-8) | Да, тривиально | Нет | Представить байты в другом алфавите. Не безопасность. |
| Хеширование (SHA-256) | Нет (одностороннее) | Нет | Отпечаток данных фиксированного размера; целостность, дедупликация, поиск. |
| Шифрование (AES) | Да, с ключом | Да | Сохранить данные конфиденциальными, читать могут только владельцы ключа. |
Самая частая ошибка новичка — принимать кодирование за безопасность. Base64 — это не шифрование: любой раскодирует его одной строкой. И хеш — тоже не шифрование: нет ключа и нет способа вернуть оригинал. Хеш отвечает на вопрос «идентичны ли две вещи?» и «не подделаны ли данные?», но никогда — «скрой это, чтобы я прочитал позже».
cryptography) — отдельная тема с управлением ключами.