Подтвердить что ты не робот

/dev/random Чрезвычайно медленно?

Некоторая справочная информация. Я искал запуск script на сервере Red Hat для чтения некоторых данных из /dev/random и использования команды Perl unpack() для ее преобразования в шестнадцатеричную строку для использования позже ( бенчмаркинг операций с базами данных). Я запускал несколько "head -1" на /dev/random, и, похоже, он работал нормально, но, позвонив несколько раз, он просто зависал. Через несколько минут он, наконец, выведет небольшой блок текста, а затем закончит.

Я переключился на /dev/urandom (я действительно не хотел, его медленнее, и мне не нужно это качество случайности), и он работал нормально для первых двух или трех вызовов, а затем он тоже начал зависать. Мне было интересно, была ли это "голова", которая бомбила его, поэтому я попытался сделать простой ввод-вывод с помощью Perl, и он тоже висел. В качестве последнего усилия я использовал команду "dd", чтобы выгрузить некоторую информацию из нее непосредственно в файл, а не в терминал. Все, что я просил, это 1 мб данных, но до того, как я его убил, потребовалось 3 минуты, чтобы получить ~ 400 байт.

Я проверил списки процессов, CPU и память были в основном нетронутыми. Что конкретно может вызвать /dev/random, чтобы это сделать, и что я могу сделать, чтобы предотвратить/исправить его в будущем?

Изменить: Спасибо за помощь, ребята! Кажется, что у меня были случайные и урбанские проблемы. Теперь у меня есть script. Похоже, сегодня я узнал что-то новое.:)

4b9b3361

Ответ 1

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

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

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

Подробнее о /dev/random и /dev/urandom см. Wikipedia.

Ответ 2

Этот вопрос довольно старый. Но все еще актуально, поэтому я собираюсь дать свой ответ. Сегодня многие процессоры оснащены встроенным аппаратным генератором случайных чисел (ГСЧ). Также многие системы поставляются с модулем доверенной платформы (TPM), который также обеспечивает ГСЧ. Есть и другие варианты, которые можно приобрести, но есть вероятность, что на вашем компьютере уже есть что-то.

Вы можете использовать rngd из пакета rng-utils на большинстве дистрибутивов Linux, чтобы получить больше случайных данных. Например, на fedora 18 все, что мне нужно было сделать, чтобы разрешить заполнение из TPM и CPU RNG (инструкция RDRAND), было:

# systemctl enable rngd
# systemctl start rngd

Вы можете сравнить скорость с и без rngd. Хорошая идея запустить rngd -v -f из командной строки. Это покажет вам обнаруженные источники энтропии. Убедитесь, что все необходимые модули для поддержки ваших источников загружены. Чтобы использовать TPM, его нужно активировать через tpm-tools. Обновление: вот хорошая инструкция.

Кстати, я читал в Интернете некоторые опасения по поводу того, что TPM RNG часто ломается по-разному, но не читал ничего конкретного против RNG, встречающихся в чипах Intel, AMD и VIA. Лучше всего использовать более одного источника, если вы действительно заботитесь о качестве случайности.

urandom хорош для большинства случаев использования (за исключением случаев, когда во время начальной загрузки). В настоящее время большинство программ используют случайный, а не случайный. Даже openssl делает это. Посмотрите мифы об урандоме и сравнении случайных интерфейсов.

В недавних Fedora и RHEL/CentOS rng-tools также поддерживают энтропию джиттера. Вы можете сделать это из-за отсутствия аппаратных опций или если вы просто доверяете этому больше, чем своему оборудованию.

ОБНОВЛЕНИЕ: другой вариант для большей энтропии - HAVEGED (сомнительное качество). На виртуальных машинах есть kvm/qemu VirtIORNG (рекомендуется).

Ответ 3

используйте /dev/urandom, это криптографически безопасно.

хорошо читать: http://www.2uo.de/myths-about-urandom/

"Если вы не уверены, следует ли вам использовать /dev/random или /dev/urandom, то, вероятно, вы захотите использовать последнее".

Если вы сомневаетесь в ранней загрузке, достаточно ли у вас энтропии. используйте вместо этого системный вызов getrandom(). [1] (из ядра Linux> = 3.17) Это лучшее из обоих миров,

  • он блокируется до (только один раз!) достаточного количества энтропии,
  • после этого он никогда не заблокируется снова.

[1] git kernel commit

Ответ 4

Если вы хотите больше энтропии для /dev/random, вам нужно либо приобрести аппаратный RNG, либо использовать один из * _ демонов entropyd для его генерации.

Ответ 5

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

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