Обидва /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.
ОНОВЛЕННЯ : Сторінка `випадкової (4) людини була оновлена з моменту написання. Тепер написано:
/dev/random
Інтерфейс вважається успадкованим інтерфейсом, і
/dev/urandom
це найбільш прийнятний і достатнім у всіх випадках використання, за винятком додатків , які вимагають хаотичності під час раннього часу завантаження; для цих додатків getrandom(2)
потрібно використовувати замість цього, оскільки він буде блокуватися до ініціалізації пулу ентропії.
Дивіться також " Міфи про / dev / urandom " Томаса Гюна.
Але /dev/urandom
, хоча він і не блокується, швидше за все, це буде занадто повільно, якщо ви хочете генерувати величезну кількість даних. Зробіть кілька вимірювань у вашій системі, перш ніж спробувати.
EDIT: Далі подається відступ від "справжніх" випадкових чисел проти псевдовипадкових чисел. Якщо все, що вас цікавить, - це практична відповідь на запитання, ви можете перестати читати зараз.
Мені здається, твердження (в тому числі в інших відповідях тут), що /dev/random
реалізує "справжній" генератор випадкових чисел, на відміну від генератора псевдовипадкових чисел (PRNG). Наприклад, стаття у Вікіпедії висуває таку претензію. Я не вірю, що це правильно. Там якась - то дискусія про нього тут , який відноситься до апаратних генераторів випадкових чисел, але я не бачу ніяких доказів того, що /dev/random
зазвичай використовується такий пристрій, або що типові комп'ютери навіть є такий пристрій. Вони відрізняються від PRNG, як-от rand()
функція C тим, що вони не детерміновані, оскільки отримують ентропію з джерел, які практично непередбачувані.
Я б сказав, що є три класи генераторів "випадкових" чисел:
Детерміновані PRNG, як і rand()
функція C , які використовують алгоритм для генерування повторюваних послідовностей, які мають (більш-менш) статистичні властивості справді випадкової послідовності. Вони можуть бути досить хорошими для ігор (зважаючи на хороший спосіб їх висіву), і необхідні для додатків, які потребують повторюваності, але вони не підходять для криптографії.
Генератори , як /dev/random
і /dev/urandom
що урожай ентропія з деякого джерела практично непередбачуваного , як активність введення / виведення (саме тому стукати на клавіатурі або переміщення миші може викликати /dev/random
для отримання більшого кількості даних). Незрозуміло (мені), чи задовольняють вони визначення PRNG (я бачив визначення, які говорять про те, що PRNG є детермінованим), але вони не є істинними генераторами випадкових чисел.
Апаратні генератори випадкових чисел , які фізично непередбачувані навіть при повному знанні свого початкового стану та додатково використовують математичні прийоми для забезпечення правильних статистичних властивостей.