Может ли SSL / TLS истощить пул энтропии моего сервера?

я пытался немного понять, как работает SSL / TLS, и взглянул на рукопожатие TLS в TLS 1.2 и TLS 1.3, где случайные числа с сервера вступают в игру. Поскольку каждый запрос TLS будет иметь стоимость с точки зрения энтропии, потому что необходимо получить криптографические ключи, я задавался вопросом, почему у серверов не заканчивается энтропия быстро.

Сначала я взглянул на TLS 1.2 с обменом ключами RSA:
В соответствии со стандартом раздела 6 TLS 1.2 случайный сервер , из которого извлекается главный секрет, в большинстве случаев имеет длину 32 байта . Я ожидал, что сервер берет 32 байта случайных данных из / dev / random .

Затем я взглянул на TLS 1.3 с эфемерным обменом ключами Диффи-Хеллмана:
И клиент, и сервер генерируют свой собственный частный набор
параметров ECDHE . После этого они делают свои вещи Диффи-Хеллмана и получают общий секрет. Этот общий секрет используется для получения симметричного ключа для шифрования и ключа для вычисления HMAC для проверки целостности сообщения. Следовательно, я бы предположил, что качество моего шифрования зависит от качества параметров ECDHE. Если я использую кривую NIST P-256, тогда мне нужно как минимум 128-битное начальное число согласно этому ответу.

В заключение:
В моем примере TLS 1.2 серверу необходимо генерировать 256-битную энтропию, а в примере 1.3 128 бит энтропии. Предполагаю, что нужные биты взяты из / dev / random . Максимальный размер моего пула энтропии 4096 бит, который возвращает cat / proc / sys / kernel / random /poolize , кажется чрезвычайно маленьким по сравнению с количеством битов, которое мне нужно для одиночное рукопожатие TLS. Если мои расчеты не завершены, я бы полностью исчерпал свой пул энтропии всего за 16 запросов на TLS 1.2, предполагая, что пул энтропии не пополняется быстро.

Вопросы:

  1. У моего сервера закончится энтропия, если он получит много запросов TLS? Или он может каким-то образом пополнить пул энтропии из запроса TLS, возможно, используя время, необходимое пакетам для перемещения туда и обратно, или что-то в этом роде.
  2. Допустим, я хотел бы немного сэкономить энтропию. Будет ли TLS 1.3 с 256-битным ECC иметь меньшую стоимость с точки зрения энтропии по сравнению с TLS 1.2? В моем примере выше я обнаружил, что стоимость энтропии для TLS 1.2 составляет 256 бит, а для TLS 1.3 - только 128 бит.
  3. Если кто-то отправит много сообщений Client Hello , не установив реального соединения, это может так он истощил мой энтропийный пул? Я бы предположил, что один Client Hello не дает мне много с точки зрения энтропии, но создает большую нагрузку на сервер, потому что он должен ответить Server Hello , содержащим 32 байта случайных данных в TLS 1.2.
1
задан 12 April 2020 в 21:00
1 ответ

Я предполагаю, что необходимые биты взяты из / dev / random.

Не надо. Блокировка применяется, когда существует риск, что система вообще имеет нулевую энтропию. Возможно, для генерации ключа хоста ssh при первой загрузке. Не для TLS во время нормальной работы, нет смысла вызывать отказ в обслуживании, потому что ему не хватает случайных битов.

Используйте (неблокирующие) криптографически безопасные генераторы псевдослучайных чисел. Если вы хотите использовать исходный код ядра, рассмотрите возможность использования getrandom () или / dev / urandom в Linux или BCryptGenRandom в Windows. В них используются те же крипто-примитивы, которые заставляют работать TLS и другие алгоритмы; если они не могут генерировать огромное количество явно случайных битов из небольшого числа, криптография взламывается.

Хотя, вероятно, библиотека TLS будет использовать свой собственный CSPRNG с небольшим начальным значением из исходного кода ядра. Простое сложение случайных битов в протоколе не показывает, сколько данных считывается из пула энтропии системы.

Что касается ОС, не забудьте указать, какой дистрибутив вы используете. Linux, агрессивно блокирующий / dev / random, нетипичен. Большинство BSD обрабатывают его так же, как / dev / urandom.

Краткий ответ: используйте / dev / urandom. Ужас, требующий блокировки / dev / random в Linux , - это суеверие . Анализ десятков ТБ случайных битов показывает, что они совпадают.

1
ответ дан 13 April 2020 в 03:47

Теги

Похожие вопросы