Какое самое безопасное начальное число для генерации случайных чисел? - PullRequest
62 голосов
/ 09 августа 2010

Каковы наиболее безопасные источники энтропии для генерации генератора случайных чисел?Этот вопрос не зависит от языка и платформы и относится к любой машине в сети.В идеале я ищу источники, доступные для машины в облачной среде или на сервере, предоставленном хостинговой компанией.

Есть два важных недостатка, о которых следует помнить.Использование времени для отправки генератора случайных чисел является нарушением CWE-337 .Использование небольшого семенного пространства было бы нарушением CWE-339 .

Ответы [ 20 ]

82 голосов
/ 20 августа 2010

Вот несколько мыслей.Если вы нетерпеливы, переходите к заключению, в конце.

1.Что такое безопасное начальное число?

Безопасность определяется только относительно модели атаки.Здесь мы хотим получить последовательность из n битов, которая имеет n битов энтропии по отношению к атакующему: простыми словами, любой из возможных 2 n значения для этой последовательности одинаково вероятны с точки зрения атакующего.

Эта модель относится к информации , доступной атакующему.Приложение, которое генерирует и использует начальное число (обычно в PRNG), знает точное начальное число;является ли семя «безопасным», не является абсолютным свойством семени или даже процесса генерации семени.Важным является количество информации, которую злоумышленник имеет о процессе генерации.Этот уровень информации широко варьируется в зависимости от ситуации;например, в многопользовательской системе (скажем, Unix-подобной, с аппаратным разделением приложений) точная синхронизация обращений к памяти может показать информацию о том, как номинально защищенный процесс считывает память.Даже удаленный злоумышленник может получить такую ​​информацию;это было продемонстрировано (в лабораторных условиях) для шифрования AES (в типичных реализациях AES используются внутренние таблицы с шаблонами доступа, зависящими от ключа; злоумышленник принудительно пропускает кэш и обнаруживает их с помощью точной синхронизации ответовсервер).

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

Смысл, который я хочу здесь подчеркнуть, состоит в том, что начальное число является «безопасным», только если оно используетсяв контексте, где он может оставаться защищенным, что более или менее подразумевает криптографически безопасный PRNG и некоторое защищенное от взлома хранилище.Если такое хранилище доступно, то наиболее безопасное начальное число - это то, которое было сгенерировано один раз , давным-давно, и использовалось в защищенном PRNG, размещенном на защищенном от несанкционированного доступа оборудовании.

К сожалению,такое оборудование дорогое (оно называется HSM и стоит несколько сотен или тысяч долларов), и эту стоимость обычно трудно оправдать (плохое начальное число не помешает работе системы; это обычная проблема непроверяемостибезопасность).Следовательно, принято использовать «в основном программные» решения.Поскольку программное обеспечение плохо подходит для обеспечения долгосрочного конфиденциального хранения, срок службы семени произвольно сокращается: периодически создается новое семя.В Fortuna такое повторное заполнение должно происходить как минимум один раз на каждый мегабайт сгенерированных псевдослучайных данных.

Подводя итог, можно сказать, что в установке без HSM безопасное начальное число - это то, чтоможет быть получено относительно легко (поскольку мы будем делать это довольно часто), используя данные, которые злоумышленник не может собрать.

2.Микширование

Случайные источники данных не дают хороших однородных битов (каждый бит имеет значение 1 с вероятностью точно 0,5 , а значения битов не зависят друг от друга).Вместо этого случайные источники производят значения в наборах, специфичных для источника.Эти значения могут быть закодированы как последовательности битов, но вы не получите своих денег: чтобы иметь n битов энтропии, вы должны иметь значения, которые при кодировании используют гораздо больше, чем n бит.

Используемый здесь криптографический инструмент - это PRF , который принимает ввод произвольной длины и выдает n -битный вывод.Криптографически защищенный PRF такого типа моделируется как случайный оракул : в краткосрочной перспективе вычислительно невозможно предсказать что-либо о выходе оракула на данном входе, не пытаясь его выполнить.

Прямо сейчас у нас есть хеш-функций . Хеш-функции должны выполнять несколько защитных свойств, а именно: устойчивость к прообразам, второстепенным изображениям и столкновениям. Обычно мы анализируем хеш-функции, пытаясь понять, как они отличаются от модели случайного оракула. Здесь есть важный момент: PRF, который следует модели случайного оракула, будет хорошей хеш-функцией, но могут быть хорошие хэш-функции (в смысле устойчивости к прообразам и столкновениям), которые, тем не менее, легко отличить от случайного оракула. , В частности, функции SHA-2 (SHA-256, SHA-512 ...) считаются безопасными, но отходят от модели случайного оракула из-за "атаки с расширением длины" (дано ч (м) , возможно вычислить ч (м || м ') для частично ограниченного сообщения м' , не зная м ). Атака с удлинением длины, по-видимому, не обеспечивает какой-либо возможности создания прообразов или столкновений, но показывает, что эти хэш-функции не являются случайными оракулами. Для участия в конкурсе SHA-3 NIST заявил, что кандидаты не должны допускать такого "увеличения длины".

Следовательно, этап смешивания не простой. Лучше всего по-прежнему прямо сейчас использовать SHA-256 или SHA-512 и переключиться на SHA-3, когда он выбран (это должно произойти примерно в середине 2012 года).

3. Источники

Компьютер является детерминированной машиной. Чтобы получить некоторую случайность, вы должны смешать в результате некоторые измерения физического мира.

Философское примечание: в какой-то момент вы должны доверять некоторым умным парням, которые могут носить лабораторные халаты или получать деньги за фундаментальные исследования. Когда вы используете хеш-функцию, такую ​​как SHA-256, вы на самом деле доверяете кучке криптографов, когда они говорят вам: мы искали недостатки, очень серьезные и в течение нескольких лет, и не нашли ни одного. Когда вы используете распадающуюся часть радиоактивного вещества со счетчиком Гейгера, вы доверяете некоторым физикам, которые говорят: мы очень серьезно искали способы предсказать, когда сработает ядро ​​следующего атома, но мы не нашли ни одного. Обратите внимание, что в данном конкретном случае к «физикам» относятся такие люди, как Беккерель, Резерфорд, Бор или Эйнштейн, а «очень усердно» означает «накопленные исследования более чем за столетие», так что вы находитесь не совсем на неисследованной территории. И все же в безопасности все еще есть немного веры.

Некоторые компьютеры уже включают аппаратное обеспечение, которое генерирует случайные данные (то есть, которое использует и измеряет физический процесс, который, насколько физик может сказать, является достаточно случайным). VIA C3 (линейка x86-совместимых процессоров) имеет такое оборудование. Как ни странно, Commodore 64, домашний компьютер 30-летней давности, также имел аппаратный RNG (или, по крайней мере, Wikipedia , по крайней мере).

За исключением специального оборудования, вы должны использовать любые физические события, которые вы можете получить. Как правило, вы будете использовать нажатия клавиш, входящие пакеты Ethernet, движения мыши, доступ к жесткому диску ... каждое событие приходит с некоторыми данными и происходит в измеримый момент (современные процессоры имеют очень точные часы благодаря счетчикам циклов). Эти моменты и содержимое данных события могут быть накоплены как источники энтропии. Это гораздо проще для самой операционной системы (которая имеет прямой доступ к аппаратному обеспечению), чем для приложений, поэтому обычный способ сбора начального числа - это запросить операционную систему (в Linux это называется /dev/random или /dev/urandom [у обоих есть свои преимущества и проблемы, выберите свой яд]; в Windows звоните CryptGenRandom()).

В крайнем случае это Java-апплеты до 1.2, до добавления java.security.SecureRandom; Поскольку Java очень эффективна для изоляции кода приложения от аппаратного обеспечения, получение случайного начального числа было сложной задачей. Обычное решение состояло в том, чтобы два или три потока работали одновременно и безумно переключались между потоками, чтобы число переключений потоков в секунду было несколько случайным (по сути, это пытается извлечь случайность посредством синхронизации действий планировщика ОС, которые зависят о том, что также происходит на машине, включая события, связанные с оборудованием). Это было довольно неудовлетворительно.

Проблема с временными мерами заключается в том, что злоумышленник также знает, какое сейчас время. Если злоумышленник имеет аппликативный доступ к машине, он также может прочитать счетчик циклов.

Некоторые люди предложили использовать звуковые карты в качестве источников "белого шума", установив усилитель на максимум (даже в настоящее время на серверах есть звук). Другие приводят доводы в пользу включения веб-камер (мы знаем, что видео с веб-камер «шумные», и это хорошо для случайности, даже если веб-камера направлена ​​к стене); но серверы с веб-камерами не распространены. Вы также можете пропинговать внешний сетевой сервер (например, www.google.com) и посмотреть, сколько времени потребуется, чтобы вернуться (но это может заметить злоумышленник, следящий за сетью).

Прелесть шага смешения с хэш-функцией заключается в том, что энтропия может только накапливаться; добавление данных не повредит, даже если эти данные не случайны. Просто запишите как можно больше с помощью хэш-функции. Хэш-функции работают довольно быстро (хорошая реализация SHA-512 будет обрабатывать более 150 МБ / с на обычном ПК с использованием одного ядра), и заполнение происходит не так часто.

4. Заключение

Используйте HSM . Они стоят несколько сотен или тысяч долларов, но разве ваши секреты не стоят намного дороже? HSM включает в себя аппаратное обеспечение RNG, запускает алгоритм PRNG и сохраняет семена с защитой от взлома. Кроме того, большинство HSM уже сертифицированы в соответствии с различными национальными правилами (например, FIPS 140 в США и уровнями EAL в Европе).

Если вы настолько дешевы, что не купите HSM, или если вы хотите защитить данные, которые на самом деле не очень полезны, то создайте криптографически безопасный PRNG, используя начальное число, полученное хэшированием lot физических мер. Все, что исходит от некоторого оборудования, должно быть хешировано вместе с моментом (считайте «счетчик циклов»), в который были получены эти данные. Вы должны хешировать данные по мегабайту здесь. Или, что еще лучше, не делайте это: просто используйте возможности, предлагаемые вашей операционной системой, которая уже содержит такой код.

48 голосов
/ 18 августа 2010

Наиболее безопасное начальное число - это то, которое имеет самый высокий уровень энтропии (или наибольшее количество битов, которые нельзя предсказать).Время, как правило, плохое семя, потому что оно имеет небольшую энтропию (т. Е. Если вы знаете, когда произошла транзакция, вы можете угадать отметку времени с точностью до нескольких бит).Аппаратные источники энтропии (например, из процессов распада) очень хороши, потому что они дают один бит энтропии на каждый бит начального числа.

Обычно аппаратный источник непрактичен для большинства потребностей, поэтому это заставляет вас полагаться на смешиваниеколичество источников энтропии низкого качества для производства более высокого.Обычно это делается путем оценки количества битов энтропии для каждой выборки, а затем сбора достаточного количества выборок, чтобы пространство для поиска источника энтропии было достаточно большим, чтобы злоумышленник не мог осуществлять поиск (128 бит - хорошее практическое правило).).

Некоторые источники, которые вы можете использовать: текущее время в микросекундах (обычно очень низкая энтропия 1/2 бит в зависимости от разрешения и насколько легко злоумышленнику угадать), время прохождения пользовательского интерфейсасобытия и т. д.

Источники операционной системы, такие как / dev / random и генератор случайных чисел Windows CAPI, часто предоставляют предварительно смешанный источник этих источников с низкой энтропией, например генератор Windows CryptGenRandom включает в себя:

  • Идентификатор текущего процесса (GetCurrentProcessID).
  • Идентификатор текущего потока (GetCurrentThreadID).
  • Количество тиков со времени загрузки (GetTickCount).
  • Текущее время (GetLocalTime).
  • Различные высокоточные рабочие характеристикиunters (QueryPerformanceCounter) .-
  • MD4-хэш блока среды пользователя, который включает имя пользователя, имя компьютера и путь поиска.[...] -
  • Высокоточные внутренние счетчики ЦП, такие как RDTSC, RDMSR, RDPMC

Некоторые PRNG имеют встроенные стратегии, позволяющие смешивать энтропию с низкойкачественные источники для получения высококачественных результатов.Один очень хороший генератор - это генератор Fortuna .Он специально использует стратегии, которые ограничивают риск, если какой-либо из источников энтропии будет скомпрометирован.

14 голосов
/ 09 августа 2010

Наиболее безопасное начальное число является действительно случайным, которое вы можете аппроксимировать в современных компьютерных системах сегодня, используя перечисленные в порядке убывания степени доверия:

  • Специальное оборудование
  • Средства, предоставляемые вашей операционной системой, которые пытаются записывать беспорядочные события, такие как чтение диска и движения мыши (/ dev / random). Другой вариант в этой строке «захват непредсказуемых событий» заключается в использовании независимого процесса или машины, которая фиксирует то, что происходит с ним, как пул энтропии, вместо обеспеченного ОС «безопасного» генератора случайных чисел, например, см. EntropyPool
  • Использование неверного начального значения (т. Е. Времени) и объединение его с другими известными вам данными (например, хэширование времени с помощью секрета и некоторых других критериев, таких как PID или внутреннее состояние приложения / ОС, поэтому не обязательно увеличивается и уменьшается в зависимости от времени)
7 голосов
/ 18 августа 2010

Как интересный пример использования одноразовых планшетов, всякий раз, когда я занимаюсь шпионажем, у меня есть система, в которой мне нужно сообщать только несколько писем. Например, в прошлый раз, когда я продавал секретные планы по созданию тостеров для герцогства Великого Фенвика, мне нужно было только шептать:

enonH

моему конфедерату. Она знала, что получит http://is.gd/enonH- (это «безопасный» URL экспандера, который ведет вас на страницу расширения is.gd, которая, в свою очередь, указывает на полностью SFW-изображение лягушки). Это дало нам 409 тыс. Бит одноразового блока или - если я подмигиваю, шепча «enonH», - она ​​знает, что нужно взять хэш изображения и использовать его в качестве ключа декодирования для следующей передачи.

Из-за сжатия изображений JPEG они, как правило, являются относительно хорошими источниками энтропии, о чем сообщает ent :

$ ent frog.jpg
Энтропия = 7,955028 бит за байт.

Оптимальное сжатие уменьшит размер этого файла 51092 байт по 0 процентов.

Распределение хи-квадрат для 51092 образцы 4409,15, и случайно превышает это значение 0,01 процента от раз.

Среднее арифметическое значение байтов данных 129,0884 (127,5 = случайный).
Значение Монте-Карло для Пи 3.053435115 (ошибка 2,81 процента).
Коэффициент последовательной корреляции составляет 0,052738 (всего некоррелированный = 0,0) .норрелированный = 0,0).

Объедините это с почти невозможно угадать изображение, на которое я ее направил, и мои секретные планы тостер в безопасности от Человека.

6 голосов
/ 18 августа 2010

Ответ /dev/random на компьютере с Linux. Это очень близко к «реальному» генератору случайных чисел, где /dev/urandom может быть , генерируемым PRNG, если пул энтропии иссякает. Следующая цитата взята из random ядра Linux. C Весь этот файл прекрасно читается, много комментариев. Код сам по себе был взят из PGP. Его красота не ограничена ограничениями C, которые отмечены глобальными структурами, обернутыми аксессорами. Это просто внушающий страх дизайн.

Эта рутина собирает экологические шум от драйверов устройств и т. д., и возвращает хорошие случайные числа, подходит для криптографического использования. Кроме очевидное криптографическое использование, эти номера также хороши для посева Порядковые номера TCP и другие места где желательно иметь числа, которые не только случайны, но трудно предсказать атакующим.

Теория работы

Компьютеры - очень предсказуемые устройства. Следовательно это чрезвычайно трудно
производить действительно случайные числа на компьютер --- в отличие от
псевдослучайные числа, которые могут легко генерируется с помощью
алгоритм. К сожалению, это очень злоумышленникам легко угадать последовательность псевдослучайного числа генераторы, а для некоторых
Приложения это не приемлемо. Поэтому вместо этого мы должны попытаться собрать "шум окружающей среды" от компьютерная среда, которая должна для внешних злоумышленников будет трудно наблюдать и использовать это для генерации случайные числа. В юниксе окружающая среда, это лучше всего сделать из внутри ядра.

Источники случайности из окружения включают межклавиатуры
тайминги, таймеры прерываний от некоторые прерывания и другие события которые оба (а) недетерминированы и (б) трудно для внешнего наблюдателя измерять. Случайность из этих источники добавляются к "энтропии" пул ", который смешивается с использованием CRC-подобного функция. Это не криптографически сильный, но это адекватным предположением случайности не выбран злонамеренно, и это быстро Достаточно того, что накладные расходы делают это на каждое прерывание очень разумно. Как случайные байты смешиваются в пул энтропии, рутины сохраняют оценка того, сколько бит случайность была сохранена в внутренний генератор случайных чисел состояние.

Когда желательны случайные байты, они получаются путем взятия SHA
хеш содержимого "энтропии" пул ". Хэш SHA избегает разоблачения внутреннее состояние энтропии бассейн. Считается, что вычислительно невозможно получить любая полезная информация о ввод SHA с его выхода. Даже если можно проанализировать SHA в какой-то умный способ, пока сумма данных, возвращаемых из генератора меньше, чем присущая энтропия в
пул, выходные данные полностью непредсказуемы. По этой причине рутина уменьшает свое внутреннее подсчитать, сколько битов "правда" случайность "содержатся в пул энтропии, поскольку он выводит случайный номера. Если эта оценка достигает нуля, процедура все еще может генерировать случайные числа; однако злоумышленник может (в хотя бы в теории) уметь выводить будущий выход генератора из предыдущих результатов. Это требует успешный криптоанализ SHA, который не считается осуществимым, но есть отдаленная возможность. Тем не менее, эти цифры должны быть полезно для подавляющего большинства цели.

...

4 голосов
/ 18 августа 2010

Написать интернет-радио клиенту, использовать случайную выборку из трансляции.Иметь пул из нескольких станций на выбор и / или отступить.

3 голосов
/ 09 августа 2010

Джеймс прав.Кроме того, есть оборудование, которое вы можете приобрести и которое даст вам случайные данные.Не уверен, где я это видел, но я думаю, что я читал, что некоторые звуковые карты поставляются с таким оборудованием.

Вы также можете использовать сайт, как http://www.random.org/

3 голосов
/ 09 августа 2010

Если вы прочитаете крипто-теорию, станет очевидно, что наиболее безопасным семенем будет то, которое генерируется хаотическим событием. На протяжении всей недавней истории в тайных операциях использовалась так называемая «Одноразовая накладка» , которую невозможно взломать. Обычно они создаются с помощью ряда постов прослушивания атмосферы, разбросанных по середине нигде. Атмосферный шум достаточно хаотичен, чтобы считаться случайным. Основная проблема с этим методом заключается в том, что логистика для одноразовой площадки значительна.

Я предлагаю вам найти достаточно хаотичное событие для извлечения данных из.

2 голосов
/ 24 августа 2010

Random.org предлагает генератор истинных случайных чисел веб-сервис , "затравленный" атмосферным шумом.

Вы получаете 200 000 случайных битов бесплатно каждый день, вплоть до 1 млн. Случайных битов, после чего вам необходимо пополнить свой счет, это обходится всего в 4 миллиона битов за доллар.

2 голосов
/ 24 августа 2010

4 - выбирается очень случайным броском костей.: -)

...