Понял ли я /dev/urandom?


Я читал о /dev/urandom и насколько я могу сказать, /dev/random создает криптографически случайных чисел, используя несколько событий, таких как тайминги сетевых пакетов и т. д. Однако правильно ли я понял, что /dev/urandom использует PRNG, посеянный с номером от /dev/random? Или он просто использует /dev/random пока есть биты - и когда они заканчиваются, он возвращается к какому-то PRNG с семенем, собранным откуда?

3 60

3 ответа:

С urandom manpage:

генератор случайных чисел собирает шум окружающей среды от устройства водителей и других источников в пул энтропии. Генератор также сохраняет оценку количества бит шума в пуле энтропии. Из этого пула случайных чисел создаются.

при чтении,/dev / случайное устройство будет возвращать только случайные байты в расчетное количество битов шума в бассейне энтропии. /dev / random следует использовать, если требуется очень качественная случайность такая как одноразовая пусковая площадка или ключ поколение. если пул энтропии пусто, читает из /dev / random will блок до дополнительных экологических шум собирается.

чтение с устройства /dev / urandom не будет блокировать ожидание большего энтропия. В результате, если есть недостаточная энтропия в энтропии бассейн, возвращаемые значения теоретически уязвимы для на алгоритмы используется водителем. Знание того, как для этого нет в наличии современной не секретной литературе, но теоретически возможно, что такое нападение может существовать. Если это забота в вашем приложении, используйте /dev / random вместо этого.

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

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

на самом деле то, что вам нужно на практике, это то, что FreeBSD /dev/urandom обеспечивает: он будет читать начальное семя достаточной длины от /dev/random, затем используйте PRNG. Таким образом, он может блокировать изначально (сразу после загрузки системы), но как только он собрал достаточно энтропии, он никогда не блокируется. Это обеспечивает уровень случайности, необходимый для большинства криптографических протоколов, но не чрезмерно блокирует.

в Linux!--0--> кроме того, что она никогда не будет блокировать, и таким образом может рискнуть вернуться низкокачественная случайность, если используется сразу после загрузки. С другой стороны, /dev/random может блокировать даже долгое время после загрузки, что также является проблемой. Я часто видел, как серверы таинственно останавливаются, потому что какое-то программное обеспечение настаивало на использовании /dev/random, и сервер без клавиатуры не получал достаточно энтропии.

обычный дистрибутив Linux сохраняет при выключении случайное семя, полученное из /dev/urandom, и впрысните его назад на следующем ботинке, таким образом гарантируя качество случайного обеспеченного /dev/urandom. Только во время установки ОС криптографическое качество становится проблемой, и обычно это происходит не потому, что установка включает в себя ряд взаимодействий с человеком, который выполняет установку, давая Орды энтропии.

чтобы подвести итог, как под Linux, так и под FreeBSD, вы должны использовать /dev/urandom, а не /dev/random.

цитирую здесь

/dev/random блокируется после исчерпания пула энтропии. Он будет заблокирован до тех пор, пока не будут собраны дополнительные данные из доступных источников энтропии. Это может замедлить генерацию случайных данных.

/dev/urandom не будет блокировать. Вместо этого он будет повторно использовать внутренний пул для получения более псевдослучайных битов.


/dev/urandom лучше использовать, когда:

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

/dev/random вероятно, будет лучшим выбором, когда:

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