Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Как устроено шифрование в HTTPS?
Обзор архитектуры HTTPS
HTTPS (HyperText Transfer Protocol Secure) — это HTTP поверх слоя TLS/SSL (Transport Layer Security / Secure Sockets Layer). Он обеспечивает конфиденциальность, целостность и аутентификацию данных.
Архитектура шифрования
HTTPS использует комбинацию двух типов шифрования:
- Асимметричное (RSA, ECDH) — для безопасного обмена ключами
- Симметричное (AES) — для шифрования данных
Процесс TLS Handshake
Шаг 1: ClientHello Клиент отправляет поддерживаемые версии TLS, список cipher suites и случайное число.
Шаг 2: ServerHello Сервер выбирает версию TLS, cipher suite и отправляет свой сертификат с публичным ключом.
Шаг 3: Key Exchange Клиент генерирует pre-master secret и шифрует его открытым ключом сервера (RSA). Сервер расшифровывает своим приватным ключом.
Вычисление сессионных ключей
Обе стороны используют PRF (Pseudo Random Function) для вывода ключей:
- master_secret = PRF(pre_master_secret, client_random, server_random)
- client_write_key = PRF(master_secret, client_random, server_random)
- server_write_key = PRF(master_secret, client_random, server_random)
Эти ключи используются для AES-256 шифрования.
Шифрование данных
Для каждого пакета:
- Вычисляется MAC (HMAC-SHA256) для целостности
- Данные + MAC шифруются AES-256-CBC
- Добавляется TLS Record Header
- Отправляется в сеть
Защита от атак
Man-in-the-Middle (MITM):
- Сертификат сервера подписан центром сертификации (CA)
- Клиент проверяет подпись с помощью публичного ключа CA
- Невозможно подделать без приватного ключа CA
Перебор ключа:
- AES-256 имеет 2^256 возможных ключей (~10^77)
- На практике невозможно перебрать
Replay атаки:
- Sequence number в MAC
- Инициализирующий вектор (IV) для каждого блока
TLS 1.3 (современный подход)
ТLS 1.3 упростил процесс:
- ClientHello включает ephemeral public key
- ServerHello с key share
- Обе стороны вычисляют shared secret через ECDH
- Данные шифруются немедленно
Преимущества:
- Меньше round trips (быстрее)
- Perfect forward secrecy — даже если ключ скомпрометирован, старые сессии безопасны
Практический пример (OpenSSL в C++)
SSL_CTX *ctx = SSL_CTX_new(TLS_client_method());
SSL_CTX_load_verify_locations(ctx, "/etc/ssl/certs/ca-bundle.crt", nullptr);
SSL *ssl = SSL_new(ctx);
int sock = socket(AF_INET, SOCK_STREAM, 0);
connect(sock, ...);
SSL_set_fd(ssl, sock);
SSL_connect(ssl); // TLS handshake
const char* request = "GET / HTTP/1.1\r\n\r\n";
SSL_write(ssl, request, strlen(request)); // Зашифровано
char response[4096];
SSL_read(ssl, response, sizeof(response)); // Расшифровано
SSL_shutdown(ssl);
SSL_free(ssl);
SSL_CTX_free(ctx);
Итоговая схема
HTTPS = HTTP + TLS/SSL, где:
- TLS Handshake использует асимметричное шифрование для обмена ключами
- Вычисляются сессионные ключи через PRF
- Данные шифруются симметричным AES
- Целостность проверяется MAC (HMAC)
- Сертификаты и последовательные номера защищают от атак
Эта архитектура обеспечивает безопасность современного веб-трафика.