Scroll to navigation

RANDOM(4) Руководство программиста Linux RANDOM(4)

ИМЯ

random, urandom - устройства к генератору случайных чисел, встроенному в ядро

ОПИСАНИЕ

Специальные символьные файлы /dev/random и /dev/urandom (появились в Linux 1.3.30) предоставляют интерфейс к генератору случайных чисел, встроенному в ядро. Файл /dev/random имеет старший номер устройства 1 и младший номер устройства 8. Файл /dev/urandom имеет старший номер устройства 1 и младший номер устройства 9.

Генератор случайных чисел собирает окружающий шум от работы драйверов устройств и из других источников в пул энтропии. Генератор также постоянно оценивает количество битов шума в пуле энтропии. Именно с помощью этого пула создаются случайные числа.

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

При чтении из устройства /dev/urandom блокирования в ожидании данных не происходит. Как результат, если в пуле недостаточная энтропия, то возвращённые значения теоретически нестойки к криптографической атаке на алгоритмы, используемые драйвером. О том, как это сделать, не сказано в современной не секретной литературе, но теоретически возможно, что такая атака может существовать. Если это важно для вашего приложения, используйте лучше /dev/random.

Использование

Если вы не знаете, что выбрать — /dev/random или /dev/urandom, то лучше использовать последнее. Как правило, /dev/urandom нужно использовать везде, за исключением создания долго существующих ключей GPG/SSL/SSH.

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

Генератор случайных чисел ядра проектировался для создания небольших объёмов высококачественного начального материала для генератора псевдослучайных чисел (CPRNG). Целью ставилась безопасность, а не скорость, и поэтому он плохо подходит для генерации большого количества произвольных данных. Пользователи должны быть очень экономны при чтении начального материала из /dev/urandom/dev/random); ненужное чтение большого количества данных из этого устройства негативно отразится на других пользователях устройства.

Количество начального материала, требуемое для генерации ключей шифрования, равно эффективному размеру ключа. Например, 3072-битный закрытый ключ RSA или Diffie-Hellman имеет эффективный размер ключа 128 бит (для его подбора требуется просмотреть 2^128 значений), поэтому генератору ключа нужно только 128 бит (16 байт) начального материала из /dev/random.

Так как разумно добавить некоторый запас прочности к выше указанному минимуму как защиту против недостатков в алгоритме CPRNG, никакой доступный криптографический примитив сегодня не может обещать больше чем 256 бит безопасности, поэтому если какая-то программа читает больше чем 256 бит (32 байта) из пула случайных чисел ядра за вызов, или за разумный интервал повторного посева (не менее одной минуты), то это нужно считать как признак того, что шифрование в ней реализовано НЕДОСТАТОЧНО продуманно.

Настройка

Если в системе ещё нет /dev/random и /dev/urandom, то их можно создать следующими командами:


mknod -m 644 /dev/random c 1 8
mknod -m 644 /dev/urandom c 1 9
chown root:root /dev/random /dev/urandom

Когда Linux-система запускается без участия человека, пул энтропии может оказаться в довольно предсказуемом состоянии. Это снижает значимый объём шума в пуле энтропии ниже оцениваемого. Для преодоления этого эффекта можно сохранять информацию пула энтропии во время выключения и восстанавливать во время запуска системы. Для этого добавьте следующие строки в сценарий, который выполняется при запуске Linux-системы:


echo "Initializing random number generator..."
random_seed=/var/run/random-seed
# Carry a random seed from start-up to start-up
# Load and then save the whole entropy pool
if [ -f $random_seed ]; then
cat $random_seed >/dev/urandom
else
touch $random_seed
fi
chmod 600 $random_seed
poolfile=/proc/sys/kernel/random/poolsize
[ -r $poolfile ] && bytes=`cat $poolfile` || bytes=512
dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

Также добавьте следующие строки в сценарий, который выполняется при завершении работы Linux-системы:


# Carry a random seed from shut-down to start-up
# Save the whole entropy pool
echo "Saving random seed..."
random_seed=/var/run/random-seed
touch $random_seed
chmod 600 $random_seed
poolfile=/proc/sys/kernel/random/poolsize
[ -r $poolfile ] && bytes=`cat $poolfile` || bytes=512
dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

Интерфейс в /proc

Файлы в каталоге /proc/sys/kernel/random (начиная с 2.3.16) предоставляют дополнительный интерфейс к устройству /dev/random.

Файл entropy_avail, доступный только для чтения, показывает количество доступной энтропии. Обычно для заполненного пула энтропии значение равно 4096 (бит).

Файл poolsize содержит размер пула энтропии. Формат файла зависит от версии ядра:

В файле содержится размер пула энтропии в байтах. Обычно это число 512, но так как файл доступен на запись, значение можно изменить, подстроив его под доступный алгоритм. Возможные значения — 32, 64, 128, 256, 512, 1024 или 2048.
Файл доступен только на чтение и содержит размер пула энтропии в битах. Значение равно 4096.

В файле read_wakeup_threshold содержится количество бит энтропии, требуемое для пробуждения процессов, которые спят в ожидании энтропии из /dev/random. По умолчанию равно 64. В файле write_wakeup_threshold содержится количество бит энтропии, менее которого мы пробуждаем процессы, которые выполнили вызовы select(2) или poll(2) для ожидания записи в /dev/random. Эти значения можно изменить, записав новые числа в эти файлы.

Файлы uuid и boot_id, доступные только для чтения, содержат произвольные строки вида 6fd5a44b-35f4-4ad4-a9b9-6b9be13e1fe9. Значение первого генерируется заново при каждом чтении, а значение второго генерируется только один раз.

ФАЙЛЫ

/dev/random
/dev/urandom

СМОТРИТЕ ТАКЖЕ

mknod (1)
RFC 1750, "Randomness Recommendations for Security"

2010-08-29 Linux