Почему запись в / dev / random не делает параллельное чтение из / dev / random быстрее?

Обычно чтение из /dev/random производит 100-500 байтов и блоков, ожидая сбора энтропии.

Почему не записывает информацию в /dev/random другими процессами, ускоряет чтение? Разве он не должен обеспечивать требуемую энтропию?

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

3 Solutions collect form web for “Почему запись в / dev / random не делает параллельное чтение из / dev / random быстрее?”

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

Мне нужна была такая же функциональность для тестирования моей программы настройки смарт-карт , поскольку я не хотел дожидаться, когда моя мышь / клавиатура будет генерировать достаточно для нескольких вызовов gpg которые были сделаны для каждого тестового прогона. То, что я сделал, – запустить программу Python, которая следует, параллельно моим тестам. Разумеется, он не должен использоваться вообще для реального генерации ключей gpg , так как случайная строка не является случайной (система генерирует случайную информацию по-прежнему будет чередоваться). Если у вас есть внешний источник для random установки строки, вы должны иметь высокую энтропию. Вы можете проверить энтропию с помощью:

 cat /proc/sys/kernel/random/entropy_avail 

Программа:

 #!/usr/bin/env python # For testing purposes only # DO NOT USE THIS, THIS DOES NOT PROVIDE ENTROPY TO /dev/random, JUST BYTES import fcntl import time import struct RNDADDENTROPY=0x40085203 while True: random = "3420348024823049823-984230942049832423l4j2l42j" t = struct.pack("ii32s", 8, 32, random) with open("/dev/random", mode='wb') as fp: # as fp has a method fileno(), you can pass it to ioctl res = fcntl.ioctl(fp, RNDADDENTROPY, t) time.sleep(0.001) 

(Не забудьте убить программу после того, как вы закончите.)

Как правило, он разработан разработчиками ядра и задокументирован в man 4 random :

 Writing to /dev/random or /dev/urandom will update the entropy pool with the data written, but this will not result in a higher entropy count. This means that it will impact the contents read from both files, but it will not make reads from /dev/random faster. 

Энтони уже объяснил, что запись в /dev/random не увеличивает счет энтропии и показывает, как RNDADDENTROPY ioctl (см. Случайное (4) ) можно использовать для кредитования энтропии. Это, очевидно, не очень безопасно, так что это альтернатива, когда имеется генератор случайных чисел.

Следующие реализации берут 512 байт (4096 бит) случайности из /dev/hwrng и перенаправляют их в пул энтропии (зачисление 4 бит энтропии на каждый байт, это произвольный выбор от меня). После этого он вызовет select (2) syscall для блокировки, когда пул энтропии заполнен (задокументирован в случайной (4) man-странице).

Версия Python:

 import fcntl, select, struct with open('/dev/hwrng', 'rb') as hw, open('/dev/random') as rnd: while True: d = hw.read(512) fcntl.ioctl(rnd, 0x40085203, struct.pack('ii', 4 * len(d), len(d)) + d) select.select([], [rnd], []) 

Так как у Arch Linux iso не установлен Python, вот версия Perl:

 open my $hw, "</dev/hwrng" and open my $rnd, "</dev/random" or die; for (;;) { my $l = read $hw, my $d, 512; ioctl $rnd, 0x40085203, pack("ii", 4 * $l, $l) . $d or die; vec(my $w, fileno $rnd, 1) = 1; select undef, $w, undef, undef } 

Вероятно, это то, что делает rngd-программа (часть rng-tools ) (непроверенная), за исключением того, что она использует инструменты (Python или Perl), которые уже широко доступны.

  • Создание уникальных номеров Функция RANDOM OS X
  • Bash - Замена случайного числа между кавычками
  • Используйте малиновый pi как источник энтропии для / dev / random
  • использование случайных в tar для распаковки файлов
  • Как безопасно рандомизировать порядок символов в строке?
  • Переменная, случайным образом выбранная из трех чисел (10, 100 и 1000)
  • Каковы опции -use-urandom или --use-random в LUKS?
  • Почему tr не читается с / dev / urandom на OSX?
  • Улучшение генерации ложных данных
  • Проверьте, правильно ли загружен / dev / urandom в Linux
  • Добавление Echo
  • Какая программа (ы) понижает мой уровень энтропийного пула?
  • Interesting Posts

    Разная версия Python не может найти модули

    Как загрузить initrd в память для передачи ядра при использовании kexec?

    Будет ли автолог создавать проблемы с удаленной безопасностью?

    Выполняется стоп-задание для LVM

    Использование grep для поиска первых двух номеров IP-адресов?

    Попытка понять .bashrc, env и export

    Сломанная труба при выходе grepping, но только с флагом -i

    Как установить версию glibc, которая соответствует GCC 4.4 на RHEL5

    Как добавить условие в цикл for во время подстановки, если строка равна нулю

    Как запустить Django и LAMP на разных поддоменах, но на одном сервере Apache?

    Условно включить этап трубы в сценарии bash

    Как отправить уведомление обо всех активных оболочках, например shutdown?

    Запуск etherpad в качестве сервиса на малине pi

    Резервное копирование большого файла

    Как узнать, используется ли портативный жесткий диск и будет ли его горячим подключением?

    Linux и Unix - лучшая ОС в мире.