Шифрование между браузером и сервером осуществляется c использованием протокола HTTPS, который является надстройкой над HTTP с использованием протоколов SSL/TLS (Secure Sockets Layer / Transport Layer Security).
Процесс установки защищенного соединения (Handshake):
- Client Hello: Браузер отправляет серверу сообщение, содержащее поддерживаемые им версии SSL/TLS, список шифровальных алгоритмов (cipher suites), алгоритмы сжатия и случайное число (клиента).
- Server Hello: Сервер выбирает наилучшую версию протокола, шифровальный набор и алгоритм сжатия из предложенных браузером, а также генерирует собственное случайное число (сервера) и отправляет их браузеру вместе со своим SSL/TLS-сертификатом.
- Authentication: Браузер проверяет сертификат сервера:
- Доверенность корневого центра сертификации (Root CA).
- Срок действия сертификата.
- Соответствие доменного имени в сертификате адресу веб-сайта.
- Отсутствие сертификата в списке отозванных (CRL или OCSP).
- Premaster Secret: Браузер генерирует случайное число (premaster secret), шифрует его открытым ключом сервера (из сертификата) и отправляет серверу.
- Session Key Generation: Оба, браузер и сервер, используют клиентский (Client Random), серверный (Server Random) случайные числа и premaster secret для генерации симметричного сеансового ключа (session key).
- Change Cipher Spec: Браузер отправляет серверу сообщение, информирующее о переходе к использованию сгенерированного сеансового ключа для дальнейшей коммуникации.
- Finished: Браузер отправляет серверу хэш всех предыдущих сообщений рукопожатия, зашифрованный сеансовым ключом. Это сообщение проверяет корректность рукопожатия.
- Change Cipher Spec: Сервер отправляет браузеру сообщение о переходе к зашифрованной связи.
- Finished: Сервер отправляет браузеру хэш всех предыдущих сообщений рукопожатия, зашифрованный сеансовым ключом.
После успешного рукопожатия вся последующая передача данных между браузером и сервером происходит с использованием симметричного шифрования на основе сгенерированного сеансового ключа. Симметричное шифрование гораздо производительнее асимметричного, что делает его подходящим для шифрования больших объемов данных.
Применяемые алгоритмы (пример):
- Асимметричное шифрование (для обмена сеансовым ключом): RSA, Diffie-Hellman (DH), Elliptic Curve Diffie-Hellman (ECDH).
- Симметричное шифрование (для шифрования данных): AES, 3DES, ChaCha20.
- Хэширование (для проверки целостности сообщений): SHA-256, SHA-384.