Как отметил @DavidSchwartz в комментарии , использование /dev/urandomпредпочтительнее в подавляющем большинстве случаев. Он и другие также предоставили ссылку на прекрасные Мифы о/dev/urandom статье, которые я рекомендую для дальнейшего чтения.
Количество энтропии оценивается консервативно, но не учитывается
/dev/urandomникогда не заблокирует, чтение из /dev/randomможет остановить выполнение процессов.
В редких случаях, очень скоро после загрузки, CSPRNG, возможно, не обладал достаточной энтропией, чтобы быть правильно посеянным, и /dev/urandomможет не производить высококачественную случайность.
Низкий уровень энтропии не является проблемой, если CSPRNG изначально был посеян правильно
CSPRNG постоянно пересевается
В Linux 4.8 и более поздних версиях не истощает /dev/urandomпул энтропии (используется /dev/random), а использует вывод CSPRNG из восходящего потока.
Вскоре после загрузки на устройстве с низкой энтропией, если достаточное количество энтропии еще не было сгенерировано для правильного заполнения /dev/urandom.
macOS использует 160-битный Yarrow на основе SHA1. Нет разницы между / dev / random и / dev / urandom; оба ведут себя одинаково. IOS от Apple также использует Yarrow.
/dev/urandomэто просто ссылка на /dev/randomи только блоки, пока правильно не посеян.
Это означает, что после загрузки FreeBSD достаточно умен, чтобы подождать, пока достаточная начальная энтропия будет собрана, прежде чем доставить бесконечный поток случайного совершенства.
NetBSD
Используйте /dev/urandom, если ваша система прочитала хотя бы один раз, /dev/randomчтобы обеспечить правильное начальное заполнение.
/dev/randomИногда блоки. Заблаговременно блокируется при загрузке, если известно, что состояние системы предсказуемо.
Приложения должны читать из / dev / urandom, когда им нужны случайно сгенерированные данные, например, криптографические ключи или начальные числа для моделирования.
Системы должны быть спроектированы так, чтобы по крайней мере один раз разумно считывать из / dev / random при загрузке, прежде чем запускать какие-либо службы, которые общаются с Интернетом или иным образом требуют криптографии, чтобы избежать предсказуемой генерации ключей.
BSD: Use/dev/urandom - за исключением того, что в /dev/urandomOpenBSD нет такой вещи как . OpenBSD имеет /dev/arandom, но вы не должны использовать его, вы должны использовать arc4random(3)функцию вместо этого. Возможно, совет о случайных устройствах и функциях должен быть оставлен людям, которые действительно понимают, о чем все это?
Satō Katsura
1
@SatoKatsura Хороший улов. Обновлен до FreeBSD, чтобы отразить цитату. Как бы вы предложили определить, кто эти люди?
Том Хейл
3
Академические квалификации? Рецензируемая работа?
Satō Katsura
1
« /dev/randomблокирует, когда заканчивается энтропия» - в Linux это зависит от того, как вы открываете устройство. Если openфлаги включают, O_NONBLOCKон не будет блокироваться. Если энтропия отсутствует, вызов немедленно возвращается и показывает 0 прочитанных байтов.
1
@ TomHale Поведение менее удивительно, ИМО. Если /dev/randomэто только (например, 60 байтов), ddдаст вам файл 60 байтов. Использование headв том же сценарии, вероятно, будет выглядеть так, как будто оно висит навсегда. Ни один не делает то, что вы хотите, но, по крайней мере для меня, более очевидно, что headне делает то, что ожидалось.
Райан Дж
5
Традиционно, единственное различие между /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 .
Практически никто не использует / 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 не регистрирует сбои генератора. Они не хотели, чтобы записи заполняли системный журнал. На сегодняшний день большинство сбоев скрыты и остаются незамеченными большинством пользователей.
Конкретно я добавил depends on DEBUG_KERNEL. Это означает, что эти полезные предупреждения коснутся только других разработчиков ядра. Это, вероятно, именно то, что мы хотим. Если различные связанные разработчики увидят предупреждение, исходящее от их конкретной подсистемы, они будут более мотивированы, чтобы исправить это. Обычные пользователи в ядрах распространения вообще не должны видеть предупреждений или спама, поскольку обычно пользователи не используют DEBUG_KERNEL.
Я считаю плохой идеей подавлять все сообщения с точки зрения безопасности.
Многие люди не запускают отладочные ядра. Большинство пользователей, которые хотят или должны знать о проблемах, не осознают, что это происходит. Подумайте, причина, по которой мы узнали о проблемах systemd, была связана с dmesg.
Подавление всех сообщений для всех конфигураций создает более широкую сеть, чем необходимо. Конфигурации, которые потенциально могут быть обнаружены и исправлены, скорее всего, останутся незамеченными. Если проблема не будет выявлена, она не будет устранена.
Я чувствую, что ядро принимает политические решения для некоторых организаций. Для тех, у кого есть аппаратное обеспечение, которое эффективно нефиксировано, организация должна решить, что делать, основываясь на своих рисках. Они могут решить смириться с риском или могут обновить оборудование. Однако без информации по этому вопросу они могут даже не осознавать, что у них есть предмет, требующий действий.
Компромисс, в конечном итоге достигнутый позже в потоке, был по крайней мере один dmesg на вызывающий модуль.
Ответы:
TL; DR
Используйте
/dev/urandom
для большинства практических целей.Более длинный ответ зависит от того, какой Unix вы используете.
Linux
Исторически
/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
Это не имеет значения, как говорит Википедия :
FreeBSD
Это не имеет значения, как говорит Википедия :
Это означает, что после загрузки FreeBSD достаточно умен, чтобы подождать, пока достаточная начальная энтропия будет собрана, прежде чем доставить бесконечный поток случайного совершенства.
NetBSD
Используйте
/dev/urandom
, если ваша система прочитала хотя бы один раз,/dev/random
чтобы обеспечить правильное начальное заполнение.Страница rnd (4) говорит :
источник
/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
и это терпит частые неудачи. Тест выполняет три шага: (1) утечка/dev/random
, запрашивая 10 Кбайт в неблокирующем режиме; (2) запросить 16 байтов в режиме блокировки (3) попытаться сжать блок, чтобы определить, является ли он случайным (тест Бедного человека). Тест занимает минуты.Проблема настолько серьезна в системах Debain (i686, x86_64, ARM и MIPS), что мы попросили GCC Compile Farm установить
rng-tools
пакет для своих тестовых компьютеров. Из Установить rng-tools на gcc67 и gcc68 :BSD и OS X отображаются в порядке. Проблема определенно в Linux.
Также стоит упомянуть, что Linux не регистрирует сбои генератора. Они не хотели, чтобы записи заполняли системный журнал. На сегодняшний день большинство сбоев скрыты и остаются незамеченными большинством пользователей.
Ситуация должна скоро измениться, так как ядро собирается напечатать хотя бы одно сообщение об ошибке. Из [PATCH] random: заставить замолчать предупреждения компилятора и исправить гонку в криптографическом списке рассылки ядра:
Компромисс, в конечном итоге достигнутый позже в потоке, был по крайней мере один dmesg на вызывающий модуль.
источник