Я должен использовать /dev/random
или /dev/urandom
?
В каких ситуациях я бы предпочел одно другому?
Я должен использовать /dev/random
или /dev/urandom
?
В каких ситуациях я бы предпочел одно другому?
Ответы:
Используйте /dev/urandom
для большинства практических целей.
Более длинный ответ зависит от того, какой Unix вы используете.
Исторически /dev/random
и /dev/urandom
оба были введены одновременно.
Как отметил @DavidSchwartz в комментарии , использование /dev/urandom
предпочтительнее в подавляющем большинстве случаев. Он и другие также предоставили ссылку на прекрасные Мифы о/dev/urandom
статье, которые я рекомендую для дальнейшего чтения.
В итоге:
/dev/random
блоки, когда заканчивается энтропия/dev/urandom
никогда не заблокирует, чтение из /dev/random
может остановить выполнение процессов./dev/urandom
может не производить высококачественную случайность./dev/urandom
пул энтропии (используется /dev/random
), а использует вывод CSPRNG из восходящего потока./dev/urandom
.Исключения из правила
В Cryptography Stack биржи Когда использовать /dev/random
более /dev/urandom
в Linux
@otus дает два варианта использования :
Вскоре после загрузки на устройстве с низкой энтропией, если достаточное количество энтропии еще не было сгенерировано для правильного заполнения /dev/urandom
.
Генерация одноразовой площадки с информационной теоретической безопасностью
Если вас беспокоит (1), вы можете проверить энтропию, доступную в/dev/random
.
Если вы делаете (2), вы уже будете знать это :)
Примечание: вы можете проверить, заблокирует ли чтение из / dev / random , но остерегайтесь возможных условий гонки.
Альтернатива: не используйте ни один!
@otus также указал, что getrandom()
система будет читать /dev/urandom
и блокировать только в том случае, если начальная энтропия семян недоступна.
Есть проблемы с изменением /dev/urandom
использованияgetrandom()
, но возможно, что новое /dev/xrandom
устройство будет создано на основе getrandom()
.
Это не имеет значения, как говорит Википедия :
macOS использует 160-битный Yarrow на основе SHA1. Нет разницы между / dev / random и / dev / urandom; оба ведут себя одинаково. IOS от Apple также использует Yarrow.
Это не имеет значения, как говорит Википедия :
/dev/urandom
это просто ссылка на/dev/random
и только блоки, пока правильно не посеян.
Это означает, что после загрузки FreeBSD достаточно умен, чтобы подождать, пока достаточная начальная энтропия будет собрана, прежде чем доставить бесконечный поток случайного совершенства.
Используйте /dev/urandom
, если ваша система прочитала хотя бы один раз, /dev/random
чтобы обеспечить правильное начальное заполнение.
Страница rnd (4) говорит :
/dev/urandom
Никогда не блокирует.
/dev/random
Иногда блоки. Заблаговременно блокируется при загрузке, если известно, что состояние системы предсказуемо.Приложения должны читать из / dev / urandom, когда им нужны случайно сгенерированные данные, например, криптографические ключи или начальные числа для моделирования.
Системы должны быть спроектированы так, чтобы по крайней мере один раз разумно считывать из / dev / random при загрузке, прежде чем запускать какие-либо службы, которые общаются с Интернетом или иным образом требуют криптографии, чтобы избежать предсказуемой генерации ключей.
/dev/urandom
- за исключением того, что в /dev/urandom
OpenBSD нет такой вещи как . OpenBSD имеет /dev/arandom
, но вы не должны использовать его, вы должны использовать arc4random(3)
функцию вместо этого. Возможно, совет о случайных устройствах и функциях должен быть оставлен людям, которые действительно понимают, о чем все это?
/dev/random
блокирует, когда заканчивается энтропия» - в Linux это зависит от того, как вы открываете устройство. Если open
флаги включают, O_NONBLOCK
он не будет блокироваться. Если энтропия отсутствует, вызов немедленно возвращается и показывает 0 прочитанных байтов.
/dev/random
это только (например, 60 байтов), dd
даст вам файл 60 байтов. Использование head
в том же сценарии, вероятно, будет выглядеть так, как будто оно висит навсегда. Ни один не делает то, что вы хотите, но, по крайней мере для меня, более очевидно, что head
не делает то, что ожидалось.
Традиционно, единственное различие между /dev/urandom
и /dev/random
заключается в том, что происходит, когда ядро думает, что в системе нет энтропии - /dev/random
закрывается /dev/urandom
неудачно, открывается неудачно. Оба водителя были энтропии поиск с add_disk_randomness()
, add_interrupt_randomness()
и add_input_randomness()
. Смотрите /drivers/char/random.c
подробности.
Отредактировано, чтобы добавить: Начиная с Linux 4.8 /dev/urandom
был переработан для использования CSPRNG.
Итак, когда вы должны закрыться? Для любого вида криптографического использования, в частности, для посева DRBG. Есть очень хорошая статья, объясняющая последствия использования /dev/urandom
при генерации ключей RSA и нехватки энтропии. Читайте Mining Your Ps и Qs .
Это своего рода ответ «я тоже», но он усиливает рекомендацию Тома Хейла. Это прямо относится к Linux.
/dev/urandom
/dev/random
По словам Теодора Цо из списка рассылки Linux Kernel Crypto, /dev/random
он устарел в течение десятилетия. От Re: [RFC PATCH v12 3/4] Генератор случайных чисел в Linux :
Практически никто не использует / dev / random. Это по сути устаревший интерфейс; Основными интерфейсами, которые были рекомендованы более десяти лет, является / dev / urandom, а теперь - getrandom (2).
Мы регулярно тестируем, /dev/random
и это терпит частые неудачи. Тест выполняет три шага: (1) утечка /dev/random
, запрашивая 10 Кбайт в неблокирующем режиме; (2) запросить 16 байтов в режиме блокировки (3) попытаться сжать блок, чтобы определить, является ли он случайным (тест Бедного человека). Тест занимает минуты.
Проблема настолько серьезна в системах Debain (i686, x86_64, ARM и MIPS), что мы попросили GCC Compile Farm установить rng-tools
пакет для своих тестовых компьютеров. Из Установить rng-tools на gcc67 и gcc68 :
Я хотел бы попросить установить rng-tools на gcc67 и gcc68. Это системы Debian, и / dev / random страдает от истощения энтропии без rng-инструментов при тестировании библиотек, которые используют устройство.
BSD и OS X отображаются в порядке. Проблема определенно в Linux.
Также стоит упомянуть, что Linux не регистрирует сбои генератора. Они не хотели, чтобы записи заполняли системный журнал. На сегодняшний день большинство сбоев скрыты и остаются незамеченными большинством пользователей.
Ситуация должна скоро измениться, так как ядро собирается напечатать хотя бы одно сообщение об ошибке. Из [PATCH] random: заставить замолчать предупреждения компилятора и исправить гонку в криптографическом списке рассылки ядра:
Конкретно я добавил
depends on DEBUG_KERNEL
. Это означает, что эти полезные предупреждения коснутся только других разработчиков ядра. Это, вероятно, именно то, что мы хотим. Если различные связанные разработчики увидят предупреждение, исходящее от их конкретной подсистемы, они будут более мотивированы, чтобы исправить это. Обычные пользователи в ядрах распространения вообще не должны видеть предупреждений или спама, поскольку обычно пользователи не используют DEBUG_KERNEL.Я считаю плохой идеей подавлять все сообщения с точки зрения безопасности.
Многие люди не запускают отладочные ядра. Большинство пользователей, которые хотят или должны знать о проблемах, не осознают, что это происходит. Подумайте, причина, по которой мы узнали о проблемах systemd, была связана с dmesg.
Подавление всех сообщений для всех конфигураций создает более широкую сеть, чем необходимо. Конфигурации, которые потенциально могут быть обнаружены и исправлены, скорее всего, останутся незамеченными. Если проблема не будет выявлена, она не будет устранена.
Я чувствую, что ядро принимает политические решения для некоторых организаций. Для тех, у кого есть аппаратное обеспечение, которое эффективно нефиксировано, организация должна решить, что делать, основываясь на своих рисках. Они могут решить смириться с риском или могут обновить оборудование. Однако без информации по этому вопросу они могут даже не осознавать, что у них есть предмет, требующий действий.
Компромисс, в конечном итоге достигнутый позже в потоке, был по крайней мере один dmesg на вызывающий модуль.