Оба /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для получения большего количества данных). Не ясно (мне) они удовлетворяют ли определение ПСЧ (я видел определений , которые говорят ГСЧ является детерминированным), но при этом они не истинные генераторы случайных чисел.
Аппаратные генераторы случайных чисел , которые физически непредсказуемы даже с полным знанием их начального состояния, и которые дополнительно используют математические методы для обеспечения правильных статистических свойств.