И /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, таких как функция C rand()
тем, что они не являются детерминированными, поскольку они собирают энтропию из источников, которые практически непредсказуемы.
Я бы сказал, что есть три класса генераторов "случайных" чисел:
Детерминированные PRNG, такие как функция C rand()
, которые используют алгоритм для генерации повторяющихся последовательностей, которые имеют (более или менее) статистические свойства действительно случайной последовательности. Они могут быть достаточно хороши для игр (учитывая хороший способ их заполнения) и необходимы для приложений, которые требуют повторяемости, но они не подходят для криптографии.
Генераторы типа /dev/random
и /dev/urandom
которые собирают энтропию из какого-либо практически непредсказуемого источника, такого как операции ввода-вывода (поэтому нажатие на клавиатуре или перемещение мыши может привести к тому, что /dev/random
произведет больше данных). Не ясно (мне) они удовлетворяют ли определение ПСЧ (я видел определений , которые говорят ГСЧ является детерминированным), но они также не истинные генераторы случайных чисел.
Аппаратные генераторы случайных чисел , которые физически непредсказуемы даже с полным знанием их начального состояния, и которые дополнительно используют математические методы для обеспечения правильных статистических свойств.