Я попытался немного понять, как работает SSL / TLS, и взглянул на Рукопожатие TLS в TLS 1.2 и TLS 1.3, а где случайные числа с сервера вступите в игру там. Поскольку каждый запрос TLS будет иметь стоимость с точки зрения энтропии, потому что необходимо получить криптографические ключи, я задавался вопросом, почему у серверов не заканчивается энтропия быстро.
Сначала я взглянул на TLS 1.2 с обменом ключами RSA:
Согласно Стандарт TLS 1.2 Раздел 6 server random
из которого выводится мастер-секрет, в большинстве случаев 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/poolsize
возвращается, кажется чрезвычайно маленьким по сравнению с количеством битов, которое мне нужно для одного рукопожатия 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 суеверие. Анализ десятков ТБ случайных битов показывает, что они такие же.