я пытался немного понять, как работает 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, предполагая, что пул энтропии не пополняется быстро.
Вопросы:
Client Hello
, не установив реального соединения, это может так он истощил мой энтропийный пул? Я бы предположил, что один Client Hello
не дает мне много с точки зрения энтропии, но создает большую нагрузку на сервер, потому что он должен ответить Server Hello
, содержащим 32 байта случайных данных в TLS 1.2. Я предполагаю, что необходимые биты взяты из / dev / random.
Не надо. Блокировка применяется, когда существует риск, что система вообще имеет нулевую энтропию. Возможно, для генерации ключа хоста ssh при первой загрузке. Не для TLS во время нормальной работы, нет смысла вызывать отказ в обслуживании, потому что ему не хватает случайных битов.
Используйте (неблокирующие) криптографически безопасные генераторы псевдослучайных чисел. Если вы хотите использовать исходный код ядра, рассмотрите возможность использования getrandom () или / dev / urandom в Linux или BCryptGenRandom в Windows. В них используются те же крипто-примитивы, которые заставляют работать TLS и другие алгоритмы; если они не могут генерировать огромное количество явно случайных битов из небольшого числа, криптография взламывается.
Хотя, вероятно, библиотека TLS будет использовать свой собственный CSPRNG с небольшим начальным значением из исходного кода ядра. Простое сложение случайных битов в протоколе не показывает, сколько данных считывается из пула энтропии системы.
Что касается ОС, не забудьте указать, какой дистрибутив вы используете. Linux, агрессивно блокирующий / dev / random, нетипичен. Большинство BSD обрабатывают его так же, как / dev / urandom.
Краткий ответ: используйте / dev / urandom. Ужас, требующий блокировки / dev / random в Linux , - это суеверие . Анализ десятков ТБ случайных битов показывает, что они совпадают.