Криптография
Криптография на практике
Heartbleed: два года в production, 17% серверов сети, утечка приватных ключей TLS - и всё это из-за отсутствия одной проверки длины. Правильная математика, неправильный код.
- Heartbleed 2014: OpenSSL читал 64 кБ чужой памяти сервера - Google, Yahoo, GitHub немедленно отозвали сертификаты
- POODLE 2014: атака на SSLv3 downgrade - заставила весь интернет отключить SSLv3 за недели
- ROBOT 2017: Bleichenbacher из 1998 года переоткрыт в F5, Citrix, Cisco - facebook.com уязвим, можно подделать подпись
- Logjam 2015: 768-битные DH параметры (преднастроенные в nginx/Apache defaults) взломаны за $10,000 - NSA, предположительно, взломала все такие соединения
libsodium - безопасная криптографическая библиотека
libsodium - современная криптографическая библиотека, спроектированная для предотвращения ошибок разработчиков. Принцип: высокоуровневые API скрывают небезопасные детали. Нет алгоритмического выбора - только одна рекомендованная реализация. Автоматически использует best practices: nonce-менеджмент, аутентифицированное шифрование, constant-time сравнения. Портирована на C, Python, Node.js, Rust, Go, Java, PHP и другие.
Signal Protocol, WhatsApp, Wire используют libsodium или NaCl (predecessor). Ключевые примитивы: Curve25519/X25519 для DH, Ed25519 для подписей, ChaCha20-Poly1305 для AEAD, Argon2id для password hashing, BLAKE2b для хэширования. sodium_memzero() - безопасное обнуление памяти (компилятор не оптимизирует). sodium_memcmp() - constant-time сравнение. Эти детали критичны и автоматически правильны в libsodium.
Почему libsodium генерирует nonce автоматически, а не предоставляет его разработчику?
OpenSSL - возможности и подводные камни
OpenSSL - наиболее распространённая TLS/crypto библиотека, но имеет сложный API с десятками способов допустить ошибку. Heartbleed 2014: переполнение буфера в heartbeat расширении TLS - 2 года в production, ~17% серверов в сети уязвимы. Причина: OpenSSL не верифицировал длину heartbeat запроса. Patched в OpenSSL 1.0.1g. Следствие: LibreSSL, BoringSSL (Google) - форки с фокусом на безопасность.
BoringSSL (Google) и LibreSSL (OpenBSD) - более безопасные альтернативы с уменьшенной поверхностью атаки. BoringSSL удалил устаревшие алгоритмы, SSL 2.0/3.0, экспортную криптографию. Используется в Chrome, Android. Rustls - TLS реализация на Rust: memory-safe, без Heartbleed-класса уязвимостей. Benchmarks показывают Rustls быстрее OpenSSL на 5-20% для TLS 1.3. Cloudflare перешла на Rustls для части edge инфраструктуры в 2023.
Почему Heartbleed был настолько критичен несмотря на то что TLS шифрование работало корректно?
Типичные ошибки в криптографических реализациях
ECB mode - классическая ошибка: каждый 16-байтный блок шифруется независимо. Одинаковые plaintext-блоки -> одинаковые ciphertext-блоки. Структура данных видна через шифрование (знаменитая 'ECB penguin'). Правило: никогда не использовать ECB. Всегда CBC с random IV или (лучше) AES-GCM/ChaCha20-Poly1305. Nonce reuse с stream cipher/CTR mode: C1 = P1 XOR K, C2 = P2 XOR K, C1 XOR C2 = P1 XOR P2 - раскрывает XOR открытых текстов.
Padding Oracle: если сервер возвращает разные ошибки для 'неправильный MAC' и 'неправильный padding' - это oracle для атаки. Всегда использовать Encrypt-then-MAC (или AEAD) и одинаковое сообщение об ошибке в обоих случаях. Weak KDF: использование SHA256(password) как ключ - позволяет офлайн атаку перебором. Всегда Argon2id, bcrypt или scrypt. IV/Nonce из константы или времени: IV должен быть cryptographically random. Детерминированный IV открывает атаки повторного использования.
Почему использование `random.randint` вместо `secrets.token_bytes` для генерации ключей критически опасно?
Реальные криптографические уязвимости
POODLE 2014: атака на SSLv3 CBC padding oracle - браузеры могут downgrade-ать до SSLv3 через ошибки соединения. Исправление: отключить SSLv3 (TLS_FALLBACK_SCSV). BEAST 2011: атака на TLS 1.0 CBC через chosen-plaintext - mitigation: RC4 (но RC4 тоже сломан), потом патч TLS. CRIME/BREACH 2012-2013: атака на TLS сжатие - компрессия plaintext до шифрования раскрывает данные через размер. Исправление: отключить TLS compression.
Mozilla SSL Configuration Generator (ssl-config.mozilla.org) - инструмент для безопасной конфигурации nginx/Apache/HAProxy. testssl.sh - скрипт аудита TLS сервера: проверяет 100+ потенциальных уязвимостей. OWASP Cryptographic Storage Cheat Sheet - руководство по безопасному хранению. Правила выживания: использовать высокоуровневые библиотеки (libsodium, Tink), не изобретать криптографию, проверять конфигурацию TLS регулярно, включить PFS, отключить устаревшие алгоритмы и протоколы.
Почему большинство реальных криптографических атак эксплуатируют протокольные ошибки, а не математические слабости примитивов?
Безопасная криптография на практике
- libsodium: высокоуровневый API, автоматический nonce, constant-time - первый выбор для новых проектов
- OpenSSL: широкий API, но легко прострелить ногу - никогда не отключать verify_mode; BoringSSL/Rustls как более безопасные альтернативы
- Топ ошибок: ECB mode, nonce reuse, weak RNG (random vs secrets), timing-небезопасное сравнение MAC, verify=False
- Практика: Mozilla SSL Config Generator + testssl.sh для аудита; большинство атак - протокольные, не математические
Связанные темы
Практическая криптография объединяет знания всего курса - примитивы, протоколы и их правильное применение
- TLS протокол — Большинство практических атак (POODLE, BEAST, Logjam) направлены на TLS конфигурацию
- Хеширование паролей — Argon2id из libsodium - правильный выбор для password hashing против брутфорса
- Атаки по побочным каналам — constant-time сравнения в libsodium защищают от timing атак класса Heartbleed-adjacent
Вопросы для размышления
- Если libsodium делает большинство решений автоматически, когда разработчику всё же нужно принимать криптографические решения? Какие решения libsodium не может принять за него?