/dev/random и /dev/urandom — специальные символьные псевдоустройства в некоторых UNIX-подобных системах, впервые появившиеся в ядре Linux версии 1.3.30. Они предоставляют интерфейс к системному генератору случайных чисел, который выводит шум из драйверов устройств и других источников в «хаотичный» пул (англ. entropy pool). Генератор также сохраняет необходимое количество битов шума в этом пуле и формирует из него случайную либо псевдослучайную последовательность чисел.

Файл UNIX-устройства
/dev/random
Тип символьное (c)
Коды
ОС major minor
Solaris 149 0
Linux 1 8
Файл UNIX-устройства
/dev/urandom
Тип символьное (c)
Коды
ОС major minor
Solaris 149 1
Linux 1 9
Специальные файлы устройств

Начиная с версии ядра Linux 4.8, генератор urandom был переведен на использование потокового шифра ChaCha20 вместо SP800-90A DRBG[1][2][3]

Различие между /dev/random и /dev/urandom править

Разницу между ними можно описать так:

  • /dev/random — генератор случайных чисел;
  • /dev/urandom — генератор псевдослучайных чисел.

При чтении данных из устройства /dev/random выводятся только случайные байты, полностью состоящие из битов шума «хаотичного» пула ОС. Если «хаотичный» пул опустел, /dev/random ничего не выдаст, пока необходимое количество битов в пуле не будет создано, читающая /dev/random программа будет ждать появления очередного случайного байта.

В ядре Linux «хаотичный» пул получает энтропию из нескольких источников, в том числе из аппаратного генератора случайных чисел современных процессоров Intel[4].

Устройство /dev/random может быть необходимо пользователям, которые требуют очень высокого коэффициента случайности, например, при создании ключа шифрования, предполагающего длительное использование.

Чтение данных устройства /dev/urandom возвратит столько байтов, сколько было запрошено. В результате, если в пуле было недостаточно битов, теоретически возможно найти уязвимость алгоритма, использующего это устройство (на настоящее время нет опубликованных работ о такой атаке). Если это важно, следует использовать /dev/random.

Пример типичного использования /dev/urandom — заполнение массива «шумом»[5]:

Заполняем раздел случайными данными для удаления остаточной информации:
  dd if=/dev/urandom of=/dev/sdb3


Примечания править

  1. Jonathan Corbet (2016-05-04). "Replacing /dev/urandom" (англ.). LWN. Архивировано из оригинала 5 октября 2016. Дата обращения: 3 октября 2016.
  2. Michael Larabel, /dev/random Seeing Improvements For Linux 4.8 Архивная копия от 5 октября 2016 на Wayback Machine / Phoronix, 25 July 2016
  3. Merge tag 'random_for_linus' of git.kernel.org/pub/scm/linux/kernel/git/tytso/random (англ.). Linux kernel source tree. — «random: replace non-blocking pool with a Chacha20-based CRNG». Дата обращения: 20 сентября 2016.
  4. Торвальдс защищает сомнительный ГСЧ в Linux Архивная копия от 30 мая 2015 на Wayback Machine — Хакер, 12 сентября 2013 г.
  5. Создание шифрованного раздела в Linux Архивная копия от 30 мая 2015 на Wayback Machine — The Opennet Project

Ссылки править

  • random(4) — страница справки man для разработчика Linux — специальные файлы  (англ.)