/dev/random и /dev/urandom — специальные символьные псевдоустройства в некоторых UNIX-подобных системах, впервые появившиеся в ядре Linux версии 1.3.30. Они предоставляют интерфейс к системному генератору случайных чисел, который выводит шум из драйверов устройств и других источников в «хаотичный» пул (англ. entropy pool). Генератор также сохраняет необходимое количество битов шума в этом пуле и формирует из него случайную либо псевдослучайную последовательность чисел.
Файл UNIX-устройства | ||||||||||
/dev/random | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
Тип | символьное (c) | |||||||||
Коды | ||||||||||
|
Файл UNIX-устройства | ||||||||||
/dev/urandom | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
Тип | символьное (c) | |||||||||
Коды | ||||||||||
|
Специальные файлы устройств |
---|
Начиная с версии ядра 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
Примечания
править- ↑ Jonathan Corbet (2016-05-04). "Replacing /dev/urandom" (англ.). LWN. Архивировано 5 октября 2016. Дата обращения: 3 октября 2016.
- ↑ Michael Larabel, /dev/random Seeing Improvements For Linux 4.8 Архивная копия от 5 октября 2016 на Wayback Machine / Phoronix, 25 July 2016
- ↑ 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.
- ↑ Торвальдс защищает сомнительный ГСЧ в Linux Архивная копия от 30 мая 2015 на Wayback Machine — Хакер, 12 сентября 2013 г.
- ↑ Создание шифрованного раздела в Linux Архивная копия от 30 мая 2015 на Wayback Machine — The Opennet Project