TLS/SSL: шифрование на транспорте
TLS/SSL: шифрование на транспорте
Мы выяснили, что HTTPS добавляет к HTTP три свойства: конфиденциальность, целостность и аутентичность. В основе всего этого лежит TLS — Transport Layer Security. Разберём, из каких компонентов он состоит и как решает задачу безопасной передачи данных по незащищённой сети.
Два типа шифрования в TLS
TLS использует гибридный подход — комбинацию двух принципиально разных типов шифрования:
Симметричное шифрование: один и тот же ключ для шифрования и расшифровки. Быстрое, эффективное, подходит для потоков данных:
Отправитель: данные + ключ → [AES] → зашифрованные данные
Получатель: зашифрованные данные + тот же ключ → [AES] → данные
Асимметричное шифрование: пара ключей — открытый и закрытый. Открытый ключ можно раздавать всем, закрытый хранится в секрете. Что зашифровано открытым — расшифровывается только закрытым, и наоборот:
Отправитель: данные + открытый ключ получателя → [RSA/ECDH] → шифротекст
Получатель: шифротекст + закрытый ключ → [RSA/ECDH] → данные
Асимметричное шифрование в сотни раз медленнее симметричного, поэтому для шифрования всего трафика его не используют. Вместо этого TLS применяет асимметричное шифрование только в начале — чтобы безопасно договориться об общем симметричном ключе. Дальше весь трафик идёт через быстрое симметричное шифрование.
Как происходит обмен ключами (key exchange)
Задача: клиент и сервер никогда не встречались, но должны договориться об общем секретном ключе так, чтобы перехватчик, видящий все пакеты, не узнал ключ. Это решает алгоритм Диффи-Хеллмана (Diffie-Hellman, DH):
1. Клиент генерирует приватное число a и публичное A = g^a mod p
2. Сервер генерирует приватное число b и публичное B = g^b mod p
3. Они обмениваются публичными числами (A и B)
4. Клиент вычисляет: secret = B^a mod p
5. Сервер вычисляет: secret = A^b mod p
6. Оба получили одинаковый secret, хотя a и b никогда не передавались по сети
Перехватчик видит g, p, A, B, но не может вычислить secret без a или b — для этого нужно решить задачу дискретного логарифмирования, которая считается вычислительно нерешаемой для больших чисел.
Современные реализации TLS используют эллиптическую криптографию (ECDHE — Elliptic Curve Diffie-Hellman Ephemeral), которая даёт такой же уровень безопасности при меньших размерах ключа и быстрее.
Perfect Forward Secrecy (PFS)
Важное свойство современного TLS — Perfect Forward Secrecy. При каждом соединении генерируются новые, «эпемерные» (ephemeral) ключи. Даже если злоумышленник записал весь зашифрованный трафик и через год украл закрытый ключ сервера — расшифровать старые сессии он не сможет. Ключи для каждой сессии были одноразовыми и нигде не хранились.
Без PFS (старый RSA key exchange) кража закрытого ключа сервера компрометирует все когда-либо записанные сессии. Именно поэтому ECDHE стал стандартом, а RSA key exchange исключён из TLS 1.3.
Целостность: HMAC и AEAD
Шифрование защищает от чтения, но не от подмены. Атакующий, не зная ключа, всё равно может переставить биты в зашифрованном пакете, и после расшифровки получатся искажённые данные. Для защиты целостности используется Message Authentication Code (MAC):
Отправитель: данные + ключ → [HMAC] → подпись
отправляет: данные + подпись
Получатель: данные + ключ → [HMAC] → своя подпись
сравнивает подписи → совпали = данные не изменены
Современный TLS использует AEAD (Authenticated Encryption with Associated Data) — режим, в котором шифрование и проверка целостности объединены в одну операцию. Популярный алгоритм AEAD — AES-GCM. Он шифрует данные и одновременно вычисляет authentication tag, гарантируя и конфиденциальность, и целостность за один проход.
TLS 1.2 vs TLS 1.3
TLS эволюционировал, и текущая версия 1.3 (2018) значительно лучше предшественников:
| Характеристика | TLS 1.2 | TLS 1.3 |
|---|---|---|
| Рукопожатие | 2-RTT | 1-RTT (0-RTT для повторных) |
| Алгоритмов | Десятки, включая небезопасные | Только 5 безопасных шифронаборов |
| RSA key exchange | Да | Нет (только DH с PFS) |
| Уязвимости | BEAST, Lucky13, POODLE | Нет известных |
Упрощение в TLS 1.3 — это осознанное решение: меньше вариантов = меньше поверхность для атак. Из протокола убрали всё небезопасное: RC4, CBC, RSA key exchange, статические DH, SHA-1, 3DES. Оставлены только AEAD-шифры и алгоритмы с Perfect Forward Secrecy.
Почему симметричное шифрование быстрое, а асимметричное — медленное
Разница в скорости между AES (симметричный) и RSA/ECDSA (асимметричный) — 100–1000 раз. Причина — в математике:
- AES оперирует фиксированными блоками (128 бит) и выполняет простые операции: подстановки, сдвиги, XOR. Современные процессоры имеют аппаратные инструкции AES-NI, делающие шифрование почти бесплатным (гигабиты в секунду).
- RSA оперирует огромными числами (2048–4096 бит) и выполняет модульную экспоненту — математически тяжёлую операцию. Аппаратных ускорителей для RSA нет на том же уровне.
Поэтому гибридный подход — единственный практичный: обменяться симметричным ключом через асимметрию за миллисекунды, а потом гонять гигабайты через симметричное шифрование.
Cipher Suites: что выбирают клиент и сервер
Cipher suite — это комбинация алгоритмов для каждого этапа TLS. В TLS 1.3 их всего 5 (против десятков в TLS 1.2):
TLS_AES_256_GCM_SHA384
│ └── MAC для целостности (SHA-384)
└── Шифрование (AES-256-GCM)
TLS_CHACHA20_POLY1305_SHA256
│ └── MAC (SHA-256)
└── Шифрование (ChaCha20-Poly1305 — для мобильных без AES-NI)
Выбор cipher suite — компромисс: AES быстрее на десктопах (аппаратное ускорение), ChaCha20 быстрее на мобильных устройствах без аппаратного AES. Сервер выбирает из предложенных клиентом, обычно приоритезируя аппаратно-ускоренные варианты.
TLS на практике: HTTPS в браузере
Когда ты открываешь https://example.com, браузер и сервер автоматически выполняют TLS-рукопожатие. Тебе не нужно ни о чём думать — TLS работает прозрачно. Единственное, что ты видишь — замок в адресной строке. Если замка нет или он перечёркнут — соединение не защищено.
Проверь себя
- Зачем TLS использует два типа шифрования, а не одно?
- Что такое Perfect Forward Secrecy и почему оно важно?
- Сколько round-trip требует TLS 1.3 для нового соединения?
- Асимметричное шифрование безопасно для обмена ключами без предварительной встречи, но медленное. Симметричное быстрое, но требует общего ключа. Гибрид: асимметричное для установления ключа, симметричное для трафика.
- PFS означает, что для каждой сессии генерируются одноразовые ключи. Кража долговременного ключа сервера не позволяет расшифровать ранее записанный трафик.
- 1-RTT для нового соединения. Для повторных соединений возможно 0-RTT (данные приложения отправляются с первым же пакетом рукопожатия).
Что унести с урока
- TLS использует гибрид: асимметричное для обмена ключами, симметричное для шифрования трафика.
- Обмен ключами — через алгоритм Диффи-Хеллмана (ECDHE), гарантирует Perfect Forward Secrecy.
- AEAD (AES-GCM) одновременно шифрует и проверяет целостность.
- TLS 1.3 быстрее и безопаснее TLS 1.2: 1-RTT, только надёжные алгоритмы, только PFS.
В следующем уроке разберём TLS handshake по шагам — от ClientHello до защищённой передачи данных.