Оба /dev/random
и /dev/urandom
используют «пул энтропии». Когда пул заканчивается, он /dev/random
ожидает его пополнения, что требует отслеживания поведения системы (ввод с клавиатуры, движение мыши и т. Д.), В то время как он /dev/urandom
будет по-прежнему выдавать псевдослучайные данные. /dev/random
теоретически более высокого качества, но /dev/urandom
почти наверняка достаточно для ваших целей. (Но даже /dev/urandom
, вероятно, будет медленнее, чем некоторые другие методы. Более быстрый, но менее качественный генератор, вероятно, достаточно хорош для стирания жестких дисков. Не ясно, что злоумышленник получит какое-либо преимущество от знания последовательности, которая будет сгенерирована, или что случайные числа лучше для этой цели, чем последовательность типа 0, 1, 2, 3, 4, ....)
Цитирую справочную random(4)
страницу:
Если вы не уверены, следует ли вам использовать /dev/random
или
/dev/urandom
, то, вероятно, вы хотите использовать последний. Как правило, /dev/urandom
следует использовать все, кроме долговечных ключей GPG / SSL / SSH.
ОБНОВЛЕНИЕ : страница man random (4) была обновлена с тех пор, как я ее написал. Теперь говорится:
/dev/random
Интерфейс считается унаследованным интерфейсом, и
/dev/urandom
является предпочтительным и достаточным во всех случаях использования, за исключением приложений , которые требуют хаотичности во время раннего времени загрузки; для этих приложений getrandom(2)
необходимо использовать взамен, поскольку он будет блокироваться до тех пор, пока не будет инициализирован пул энтропии.
Смотрите также " Мифы о / dev / urandom " Томаса Хуна.
Но /dev/urandom
даже если он не будет блокироваться, он может быть слишком медленным, если вы хотите генерировать огромные объемы данных. Сделайте некоторые измерения в вашей системе, прежде чем пытаться это.
РЕДАКТИРОВАТЬ: Ниже приводится отступление от "истинных" случайных чисел против псевдослучайных чисел. Если все, что вас интересует, это практический ответ на вопрос, вы можете перестать читать сейчас.
Я, кажется, утверждаю (в том числе в других ответах здесь), что /dev/random
реализует «истинный» генератор случайных чисел, в отличие от генератора псевдослучайных чисел (PRNG). Например, статья Википедии делает такое утверждение. Я не верю, что это правильно. Там какая - то дискуссия о нем здесь , который относится к аппаратным генераторам случайных чисел, но я не вижу никаких доказательств того, что /dev/random
обычно используется такое устройство, или что типичные компьютеры даже есть такое устройство. Они отличаются от PRNG, таких как rand()
функция C, тем, что они не являются детерминированными, поскольку они собирают энтропию из источников, которые практически непредсказуемы.
Я бы сказал, что есть три класса генераторов «случайных» чисел:
Детерминированные PRNG, такие как rand()
функция C , которые используют алгоритм для генерации повторяемых последовательностей, которые имеют (более или менее) статистические свойства действительно случайной последовательности. Они могут быть достаточно хороши для игр (учитывая хороший способ их заполнения) и необходимы для приложений, которые требуют повторяемости, но они не подходят для криптографии.
Генераторы , как /dev/random
и /dev/urandom
что урожай энтропия из некоторого источника практически непредсказуемого , как активность ввода / вывода (именно поэтому стучать на клавиатуре или перемещение мыши может вызвать /dev/random
для получения большего количества данных). Не ясно (мне) они удовлетворяют ли определение ПСЧ (я видел определений , которые говорят ГСЧ является детерминированным), но при этом они не истинные генераторы случайных чисел.
Аппаратные генераторы случайных чисел , которые физически непредсказуемы даже с полным знанием их начального состояния, и которые дополнительно используют математические методы для обеспечения правильных статистических свойств.