Когда использовать /dev/random против /dev/urandom

У меня все заработало, это просто установила новейшую версию OSX (в моем случае OS Sierra), и проблема исчезла.

Я не знаю, что это говорит нам о первопричине и работает ли это для всех, но это сработало для меня. YMMV.

82
18.11.2016, 12:34
2 ответа

TL; DR

Используйте / dev / urandom для большинства практических целей.

Более подробный ответ зависит от того, какой у вас Unix.

Linux

Исторически, / dev / random и / dev / urandom вводились одновременно.

Как отметил @DavidSchwartz в комментарии , использование / dev / urandom является предпочтительным в подавляющем большинстве случаев. Он и другие также предоставили ссылку на прекрасную статью Myths about / dev / urandom , которую я рекомендую для дальнейшего чтения.

Вкратце:

  • Справочная страница вводит в заблуждение
  • Оба загружаются одним и тем же CSPRNG для генерации случайности ( диаграммы 2 и 3 )
  • / dev / random блокируется, когда заканчивается энтропия
  • Количество энтропии оценивается консервативно, но не подсчитывается
  • / dev / urandom никогда не блокируется, чтение из / dev / random может останавливать выполнение процессов.
  • В редких случаях очень скоро после загрузки CSPRNG может не иметь достаточной энтропии для правильного заполнения, а / dev / urandom может не давать высококачественной случайности.
  • Низкая энтропия не является проблемой, если CSPRNG изначально был загружен правильно
  • CSPRNG постоянно обновляется
  • В Linux 4.8 и более поздних версиях / dev / urandom не исчерпывается пул энтропии (используется / dev / random ), но использует вывод CSPRNG из восходящего потока.
  • Используйте / dev / urandom .

Исключения из правила

В Биржи криптографического стека Когда использовать / dev / random вместо / dev / urandom в Linux {{1 }} @ otus дает два варианта использования :

  1. Вскоре после загрузки на устройстве с низкой энтропией, если еще не было сгенерировано достаточно энтропии для правильного заполнения / dev / urandom .

  2. Создание одноразового блокнота с теоретической информационной безопасностью

Если вас беспокоит (1), вы можете проверить энтропию, доступную в / dev / random .

Если вы выполняете (2), вы уже это знаете :)

Примечание: вы можете проверить, блокирует ли чтение из / dev / random , но будьте осторожны с возможными условиями гонки.

Альтернатива: не используйте ни то, ни другое!

@otus также указал, что система getrandom () будет читать из / dev / urandom и блокировать, только если начальная энтропия семени недоступна.

Есть проблемы с изменением / dev / urandom на использование getrandom () , но возможно, что новый / dev / xrandom устройство создается на основе getrandom () .

macOS

Это не имеет значения, поскольку Википедия говорит :

macOS использует 160-битный Yarrow на основе SHA1. Нет никакой разницы между / dev / random и / dev / urandom; оба ведут себя одинаково. IOS от Apple также использует Тысячелистник.

FreeBSD

Это не имеет значения, поскольку Википедия говорит :

/ dev / urandom - это просто ссылка на / dev / random и только блоки, пока правильно не засеяны.

Это означает, что после загрузки FreeBSD достаточно умен, чтобы дождаться, пока будет набрано достаточно начальной энтропии, прежде чем доставить нескончаемый поток случайных качеств.

NetBSD

Используйте / dev / urandom , предполагая, что ваша система прочитала хотя бы один раз из / dev / random , чтобы обеспечить правильное начальное заполнение.

На странице rnd (4) написано :

/ dev / urandom Никогда не блокируется.

/ dev / random Иногда блоки. Будет блокироваться раньше при загрузке, если известно, что состояние системы предсказуемо.

Приложения должны читать из / dev / urandom, когда им нужны случайно сгенерированные данные, например криптографические ключи или начальные числа для моделирования.

Системы должны быть спроектированы так, чтобы разумно читать хотя бы один раз из / dev / random при загрузке перед запуском любых служб, которые обращаются к Интернету или иным образом требуют криптографии, чтобы избежать {{ 1}} генерирует ключи предсказуемо.

130
27.01.2020, 19:30

Традиционно, единственная разница между /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 and Qs.

6
27.01.2020, 19:30

Теги

Похожие вопросы