Как браузер генерирует симметричный ключ во время рукопожатия SSL
У меня небольшая путаница при рукопожатии SSL между браузером и сервером в типичном веб-сценарии https:
До сих пор я понял, что в процессе рукопожатия SSL клиент (в данном случае браузер) шифрует произвольно выбранный симметричный ключ с помощью открытого ключа (сертификат, полученный от сервера). Это отправляется обратно на сервер, сервер расшифровывает его (симметричный ключ) с помощью закрытого ключа. Этот симметричный ключ теперь используется во время оставшейся части сеанса для шифрования / дешифрования сообщений на обоих концах. Одной из основных причин для этого является более быстрое шифрование с использованием симметричных ключей.
Вопросы1) Как браузер выбирает и генерирует этот "случайно" выбранный симметричный ключ?
2) Имеют ли разработчики (и / или пользователи браузера) контроль над этим механизмом генерации симметричных ключей?
1 ответ
Вот очень хорошее описание того, как работает HTTPS-соединение. Я приведу краткую информацию о том, как сеансовый ключ получен обеими сторонами (клиентом и сервером), этот процесс известен как "протокол согласования ключей", вот как он работает:
- Клиент генерирует случайное значение 48-байтового "секрета перед мастером".
- Клиент дополняет эти байты случайными данными, чтобы ввод был равен 128 байтам.
- Клиент шифрует его с помощью открытого ключа сервера и отправляет его на сервер.
Затем мастер-ключ создается обеими сторонами следующим образом:
master_secret = PRF( pre_master_secret, "master secret", ClientHello.random + ServerHello.random )
PRF - это "псевдослучайная функция", которая также определена в спецификации и довольно умна. Он объединяет секрет, метку ASCII и начальные данные, которые мы передаем ему с помощью версий HMAC с ключами хэш-сообщений (HMAC), как хэш-функций MD5, так и SHA-1. Половина входных данных отправляется каждой хэш-функции. Это умно, потому что он довольно устойчив к атакам, даже несмотря на слабые стороны MD5 и SHA-1. Этот процесс может дать обратную связь и повторить навсегда, чтобы генерировать столько байтов, сколько нам нужно.
Следуя этой процедуре, мы получаем 48-байтовый "главный секрет".
Цитата из этого замечательного видео в сетевом видео, минута 1:18:07
Ну откуда у вас случайность на вашем компьютере, потому что ваш компьютер - детерминированное устройство?
Что ж, он собирает энтропии, такие как движения ваших движений мыши, движения клавиш и время вашего жесткого диска, он пытается собрать всю эту случайность из вселенной в извлечение, чтобы он мог генерировать случайные ключи только для одного соединения [этот сеанс]. И если эта случайность нарушена и это происходило много раз за последние 30 лет, то ничего из этого не работает. Если злоумышленник может понять, в чем заключается ваша случайность, он сможет угадать ваши ключи. Так что используйте хорошую случайность.
Примечание: ключи создаются за сеанс.