Например, можно ли с его помощью сгенерировать ключ одноразового блокнота?
Кроме того, каковы его источники и как с его помощью сгенерировать случайное число между x и y эм>?
Является ли /dev/random действительно случайным?
- Я не знаю точно, поэтому я не буду указывать это как ответ, но статья в Википедии (en.wikipedia.org/wiki//dev/random) в этом отношении довольно ясно:
/dev/random
должен подходить для использования, требующего случайности очень высокого качества, например, одноразового блокнота или генерации ключей. - тогда как/dev/urandom
нет 12.04.2011 - @Alexander Gessier Так что я должен просто поверить Википедии на слово? 12.04.2011
- Вы также можете использовать ссылки внизу статьи в Википедии, чтобы получить: kernel.org/doc/man-pages/online/pages/man4/random.4.html 12.04.2011
- Википедия просто цитирует справочную страницу. 12.04.2011
- В статье в Википедии есть ссылка на PDF-файл, в котором сообщается об исследовании /dev/random. 12.04.2011
- Обратите внимание, что комментарии на справочной странице /dev/random подверглись критике со стороны многих (хотя и не всех) людей, которые знают, что делают: sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers 13.05.2015
Ответы:
Единственная вещь в этой вселенной, которую можно считать истинной, — это та, что основана на квантовых эффектах. Типичным примером является радиоактивный распад. Для некоторых атомов можно быть уверенным только в периоде полураспада, но нельзя быть уверенным, какое ядро распадется следующим.
Насчет /dev/random
- зависит от реализации. В Linux в качестве источников энтропии используются:
Ядро Linux генерирует энтропию из таймингов клавиатуры, движений мыши и таймингов IDE и делает случайные данные символов доступными для других процессов операционной системы через специальные файлы /dev/random и /dev/urandom.
Это означает, что он лучше, чем алгоритмические генераторы случайных чисел, но и не идеален. Энтропия не может быть распределена случайным образом и может быть смещена.
Это была философия. Практика такова, что в Linux /dev/random
достаточно случайна для подавляющего большинства задач.
Существуют реализации генераторов случайных чисел, которые имеют больше источников энтропии, включая шум на аудиовходах, датчики температуры процессора и т. д. В любом случае они не соответствуют действительности.
Есть интересный сайт, где можно получить настоящие случайные числа, сгенерированные радиоактивным распадом.
Строго говоря, /dev/random
не является действительно полностью случайным. /dev/random
питается от аппаратных источников, которые предполагаются в некотором роде непредсказуемыми; затем он смешивает такие данные, используя функции (в основном хеш-функции), которые также предполагаются односторонними. Таким образом, «истинная случайность» /dev/random
связана с присущей функциям микширования безопасностью, безопасность которой гарантирована не более, чем безопасность любого другого криптографического примитива, в частности PRNG, скрытого в /dev/urandom
.
Разница между /dev/random
и /dev/urandom
заключается в том, что первый будет пытаться сохранить оценку (что означает «дикое предположение») того, сколько энтропии он собрал, и откажется выводить больше битов, чем это. С другой стороны, /dev/urandom
с радостью создаст мегабайты данных из имеющейся у него энтропии.
Разница в безопасности между этими двумя подходами не имеет смысла, если вы не предполагаете, что «классические» криптографические алгоритмы могут быть взломаны, и вы используете один из очень немногих информационно-теоретических алгоритмов (например, OTP или раскрытие секрета Шамира< /а>); и даже в этом случае /dev/random
можно считать более безопасным, чем /dev/urandom
, только если функции смешивания по-прежнему считаются односторонними, что не совместимо с идеей, что классический криптографический алгоритм может быть взломан. Так что на практике и даже в теории нет никакой разницы. Вы можете использовать выходные данные /dev/urandom
для одноразового пароля, и они не будут нарушены из-за какой-либо внутренней структуры /dev/urandom
— фактическое управление полученным потоком будет слабым местом (особенно долговременное хранение). С другой стороны, у /dev/random
есть вполне реальные практические проблемы, а именно то, что он может блокироваться в несвоевременные моменты. Это действительно утомительно, когда автоматическая установка ОС блокируется (на несколько часов!), потому что генерация ключей SSH-сервера настаивает на использовании /dev/random
и без необходимости останавливается из-за энтропии.
Есть много приложений, которые читают /dev/random
как своего рода ритуал, как будто это «лучше», чем /dev/urandom
, вероятно, на кармическом уровне. Это совершенно неправильно, особенно когда alea используется с классическими криптографическими алгоритмами (например, для генерации открытого ключа SSH-сервера). Не делай этого. Вместо этого используйте /dev/urandom
, и вы проживете дольше и счастливее. Даже для одноразового блокнота.
(Просто для полноты картины есть особенность /dev/urandom
, реализованная в Linux: он никогда не будет блокироваться, даже если он вообще не накопил никакой энтропии с момента предыдущей загрузки. Дистрибутивы избегают этой проблемы, создавая " случайное начальное число» во время установки с /dev/random
и использование этого начального числа при каждой загрузке для инициализации PRNG, используемого /dev/urandom
; новое случайное начальное число создается немедленно для следующей загрузки. Это гарантирует, что /dev/urandom
всегда работает с достаточно большим внутренним начальным числом. Реализация FreeBSD /dev/urandom
будет блокироваться до тех пор, пока не будет достигнут заданный порог энтропии, что является более безопасным.)
/dev/random
будет блокироваться, если в пуле энтропии недостаточно случайных данных, а /dev/urandom
— нет. Вместо этого /dev/urandom
вернется к PRNG (документы ядра). Из тех же документов:
Генератор случайных чисел [пул энтропии] собирает окружающий шум от драйверов устройств и других источников в пул энтропии.
Таким образом, /dev/random
не является алгоритмическим, как PRNG, но может и не быть «по-настоящему случайным». Движения мыши и время нажатия клавиш, как правило, следуют шаблонам и могут использоваться для эксплойтов. но вам придется сопоставить риск с вашим вариантом использования.
Чтобы получить случайное число между x
и y
с помощью /dev/random
, при условии, что вас устраивает 32-битное целое число, вы можете посмотреть, как Java класс java.util.Random делает это (nextInt()
), подставляя соответствующий код для чтения из /dev/random
вместо метода nextBytes()
.