Рейтинг:1

В TLS 1.3, каково рациональное использование разных расшифровок рукопожатия для главного секрета возобновления и секретов трафика приложений?

флаг in

TLS 1.3 RFC, раздел 7.1, перечисляет это как последнюю часть расписания ключей:

https://datatracker.ietf.org/doc/html/rfc8446#section-7.1

            ...
   0 -> HKDF-Extract = главный секрет
             |
             +-----> Derive-Secret(., "c ap traffic",
             | ClientHello... сервер готов)
             | = client_application_traffic_secret_0
             |
             +-----> Derive-Secret(., "s ap traffic",
             | ClientHello... сервер готов)
             | = server_application_traffic_secret_0
             |
             +-----> Derive-Secret(., "exp master",
             | ClientHello... сервер готов)
             | = exporter_master_secret
             |
             +-----> Derive-Secret(., "мастер рез",
                                   ClientHello... клиент Готово)
                                   = возобновление_мастер_секрет

Первые три вычисления занимают Главный секрет, объединяет их с labelS "c ap трафик" / "AP-трафик" / "мастер опыта" (соответственно), и хэш расшифровки рукопожатия Клиент привет через Сервер завершен. Результатом каждого из них является три ключа: client_application_traffic_secret_0, server_application_traffic_secret_0, exporter_master_secret.

Последний расчет занимает Главный секрет, объединяет его с меткой "мастер рез", и хэш расшифровки рукопожатия Клиент привет через Клиент завершен. Результатом этого является возобновление_мастер_секрет.

Мой вопрос:

В чем рациональность использования Client Hello через Client Finished вместо Client Hello через Server Finished при вычислении главного секрета возобновления?

Рейтинг:1
флаг gb

На самом деле это интересный вопрос, и я не могу сказать вам на 100% наверняка, но мои мысли по этому поводу таковы: как только Сервер отправил сообщение «Готово», он уже может начать отправлять Данные Приложения (даже если Клиент еще не отправил сообщение Finished еще). Таким образом, имеет смысл, что server_application_traffic_secret включает в себя ClientHello....ServerFinished.

Что касается resummation_master_secret, я бы сказал, что, поскольку он используется для возобновления сеанса, смысл использования ClientHello...ClientFinished состоит в том, чтобы включить в этот секрет все рукопожатие. Более того, если сервер запрашивает аутентификацию клиента по сертификату, то это также будет частью стенограммы рукопожатия.

Насколько я знаю, спецификация не оправдывает все дизайнерские решения, но я лично считаю, что это имеет смысл, поскольку (как вы можете видеть в протоколе рукопожатия ниже) наличие ClientHello...ClientFinished включает в себя все рукопожатие.

       Клиент-сервер

Ключ ^ ClientHello
Обмен | + общий_ключ*
     | + алгоритм_подписи*
     | + psk_key_exchange_modes*
     v + pre_shared_key* -------->
                                                  СерверПривет ^ Ключ
                                                 + общий_ключ* | Обмен
                                            + pre_shared_key* v
                                        {EncryptedExtensions} ^ Сервер
                                        {CertificateRequest*} v Параметры
                                               {Сертификат*} ^
                                         {Проверка сертификата*} | Авторизация
                                                   {Завершено} v
                               <-------- [Данные приложения*]
     ^ {Сертификат*}
Авторизация | {Подтверждение сертификата*}
     v {Готово} -------->
       [Данные приложения] <-------> [Данные приложения]
```
Eddie avatar
флаг in
Спасибо за ответ. Совершенно понятно, зачем включать «обе стороны» рукопожатия.Но я думаю, что меня больше всего беспокоило, почему бы не включить Server Finished в расчет ключа возобновления? Почему три предыдущих ключа включали завершение сервера, а ключ возобновления включает только завершение клиента. Зачем делать *этот* ключ отличным от предыдущих?
Eddie avatar
флаг in
Э-э, подождите... отвечая вам, я думаю, что теперь лучше понимаю ваш ответ.Завершение сервера — это полное рукопожатие в то время, когда сервер намеревается начать использовать ключи трафика приложения C/S. Но в этот момент серверу не нужен ключ возобновления, поэтому ему достаточно дождаться следующего сообщения от клиента, чтобы вычислить его, поэтому ключ возобновления включает «дополнительную» информацию из исходного рукопожатия.
Eddie avatar
флаг in
Я ставлю тебе галочку. Наблюдение за тем, что входит в ключи по сравнению с рукопожатием, прояснило, почему ключ возобновления может включать в генерацию ключа больше расшифровки рукопожатия, чем ключи трафика приложения. Спасибо Репиз!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.