Введение
Безопасность — это не просто модное слово, а базовая потребность любого современного приложения. Разработчики ежедневно работают с данными, которые должны быть защищены от перехвата, подделки и несанкционированного доступа. Криптография — это не магия, а набор строгих математических инструментов, которые позволяют обеспечить конфиденциальность, целостность и аутентификацию. В этой статье мы разберем три ключевых компонента практической криптографии: TLS/SSL, JWT и алгоритмы шифрования (AES, RSA, хэширование). Вы узнаете, как они работают, где применяются и какие ошибки допускают даже опытные программисты.
Что скрывается за аббревиатурой TLS/SSL
Протокол TLS (Transport Layer Security) — это основа безопасного общения в интернете. Когда вы видите в адресной строке HTTPS, это значит, что соединение защищено именно TLS. Его предшественник SSL (Secure Sockets Layer) уже устарел, но название часто используют как синоним.
Как работает TLS?
- Рукопожатие (Handshake): клиент и сервер обмениваются приветственными сообщениями, договариваются о версии протокола и наборе шифров.
- Аутентификация: сервер предоставляет цифровой сертификат (X.509), подписанный удостоверяющим центром (CA). Клиент проверяет его подлинность.
- Обмен ключами: используется асимметричное шифрование (например, RSA или ECDHE) для безопасной передачи сессионного ключа.
- Симметричное шифрование: все последующие данные шифруются с помощью быстрых алгоритмов, таких как AES, используя сессионный ключ.
Важно для разработчика: никогда не отключайте проверку сертификатов в production-среде. Даже если вы работаете с внутренними сервисами, используйте самоподписанные сертификаты, но не игнорируйте ошибки. Это частая уязвимость, ведущая к атакам «человек посередине» (MITM).
JSON Web Tokens (JWT) — аутентификация без состояния
JWT — это компактный, URL-безопасный способ передачи утверждений (claims) между сторонами. Он широко используется для аутентификации и обмена информацией в REST API.
Структура JWT
Токен состоит из трех частей, разделенных точками:
- Header: тип токена и алгоритм подписи (например, HS256 или RS256).
- Payload: данные (claims), такие как user_id, роль, срок действия (exp).
- Signature: подпись, созданная из header и payload с использованием секретного ключа (для HMAC) или закрытого ключа (для RSA).
Типы подписей
| Алгоритм | Тип | Ключи | Пример использования |
|---|---|---|---|
| HS256 | Симметричный | Один секретный ключ | Внутренние микросервисы, где можно безопасно хранить ключ |
| RS256 | Асимметричный | Пара: закрытый (подпись) и открытый (верификация) | OpenID Connect, сторонние приложения |
Ошибки, которых стоит избегать:
- Не храните в payload конфиденциальные данные (пароли, номера карт). JWT подписан, но не зашифрован — payload читается в Base64.
- Всегда проверяйте срок действия (exp) и издателя (iss).
- Используйте короткое время жизни токена (15–30 минут) в сочетании с refresh-токенами.
Симметричное и асимметричное шифрование: AES и RSA
AES (Advanced Encryption Standard)
AES — это симметричный блочный шифр. Он использует один и тот же ключ для шифрования и расшифровки. Сегодня это стандарт де-факто для защиты данных в покое (например, шифрование базы данных) и в транзите (внутри VPN или TLS).
Режимы работы:
- GCM (Galois/Counter Mode): обеспечивает шифрование и аутентификацию (целостность). Рекомендуется для большинства современных приложений.
- CBC (Cipher Block Chaining): требует отдельного MAC для проверки целостности, уязвим к атакам с padding oracle.
Пример на Python (используя библиотеку cryptography):
from cryptography.fernet import Fernet
key = Fernet.generate_key()
cipher = Fernet(key)
encrypted = cipher.encrypt(b"Секретные данные")
print(cipher.decrypt(encrypted))
RSA (Rivest–Shamir–Adleman)
RSA — асимметричный алгоритм, где шифрование выполняется открытым ключом, а расшифровка — закрытым. Он медленнее AES, поэтому используется для шифрования малых объемов данных (например, сессионных ключей) или для создания цифровых подписей.
Размер ключа: современный минимум — 2048 бит (рекомендуется 4096 для повышенной безопасности).
Хэширование — необратимая защита
Хэш-функции (SHA-256, SHA-3) преобразуют данные произвольной длины в строку фиксированной длины. В отличие от шифрования, этот процесс необратим. Хэширование используется для:
- Хранения паролей (но только с солью и медленными функциями вроде bcrypt, Argon2).
- Проверки целостности файлов (например, контрольные суммы).
- Создания идентификаторов (хэш-таблицы, блокчейн).
Важно: никогда не используйте MD5 или SHA-1 для задач безопасности — они уязвимы к коллизиям. SHA-256 пока считается надежным.
Практические рекомендации для разработчика
- Используйте библиотеки, а не пишите свою криптографию. Ошибки в реализации (например, неверный режим AES) делают систему уязвимой.
- Храните ключи в защищенном хранилище. Используйте менеджеры секретов (HashiCorp Vault, AWS Secrets Manager), а не в коде или конфигах.
- Регулярно обновляйте сертификаты TLS. Срок действия сертификата — не более 1 года (лучше 90 дней, как у Let's Encrypt).
- Применяйте принцип наименьших привилегий. JWT-токен должен содержать только необходимые claims.
- Тестируйте безопасность. Используйте инструменты вроде OWASP ZAP или Burp Suite для поиска уязвимостей.
Заключение
Криптография — это неотъемлемая часть работы разработчика. Понимание TLS, JWT, AES, RSA и хэширования позволяет создавать безопасные системы, устойчивые к атакам. Начните с малого: проверьте, используете ли вы HTTPS во всех своих проектах, правильно ли храните пароли и не передаете ли секреты в JWT. Помните: безопасность — это процесс, а не конечная точка. Углубляйтесь в тему, экспериментируйте с кодом и следите за современными стандартами. Ваш следующий шаг — внедрить эти знания в реальный проект уже сегодня.
Комментарии