Если я это сделаю, watch cat /proc/sys/kernel/random/entropy_avail
то увижу, что энтропия моей системы постепенно увеличивается со временем, пока не достигнет диапазона 180-190, и в этот момент она падает примерно до 120-130. Падение энтропии, по-видимому, происходит примерно каждые двадцать секунд. Я наблюдаю это, даже когда lsof
говорит, что ни один процесс не имеет /dev/random
или не /dev/urandom
открыт. Что истощает энтропию? Нужно ли ядру энтропию, или, может быть, оно перерабатывает больший пул в меньший пул лучшего качества?
Это на чистом компьютере без соединений SSL / SSH / WPA.
/dev/random
в конце концов, это то, что используется для безопасных криптографических целей, и реализация не может быть наивной. В последнем пункте может быть дано одно объяснение: en.wikipedia.org/wiki/Entropy_pool#Using_observed_events (начиная с «Поддерживать потоковый шифр с ключом и вектором инициализации ...») -> пул заменяется всякий раз, когда достаточно данные накопились./dev/random
значительной степени фальшивый - как только пул энтропии будет заполнен один раз,/dev/urandom
он так же хорош, как и/dev/random
.Ответы:
Энтропия теряется не только через
/dev/{,u}random
ядро, но и через некоторое. Например, новые процессы имеют рандомизированные адреса (ASLR), а сетевым пакетам требуются случайные порядковые номера. Даже модуль файловой системы может убрать некоторую энтропию. Смотрите комментарии в drivers / char / random.c . Также обратите внимание, чтоentropy_avail
относится к входному пулу , а не к выходным пулам (в основном неблокирующим/dev/urandom
и блокирующим/dev/random
).Если вам нужно следить за пулом энтропии, не используйте
watch cat
, это будет потреблять энтропию при каждом вызовеcat
. В прошлом я также хотел наблюдать за этим пулом, поскольку GPG очень медленно генерировал ключи, поэтому я написал программу на C с единственной целью - наблюдать за пулом энтропии: https://git.lekensteyn.nl/c-files/tree /entropy-watcher.c .Обратите внимание, что могут быть фоновые процессы, которые также потребляют энтропию. Используя точки трассировки в соответствующем ядре, вы можете видеть процессы, которые изменяют пул энтропии. Пример использования, в котором записываются все точки трассировки, связанные со случайной подсистемой, включая callchain (
-g
) на всех процессорах (-a
), начинающих измерение через 1 секунду, чтобы игнорировать свой собственный process (-D 1000
) и включающих timestamps (-T
):Прочтите его одной из следующих команд (при
perf.data
необходимости измените владельца ):perf script
Выход дает интересную информацию и показывает , когда около 8 байт (64 бит) энтропии периодически сливают на моей машине:Очевидно, это происходит для предотвращения потери энтропии путем передачи энтропии из входного пула в выходные пулы:
источник
watch
) неуклонно растет, а затем резко падает. Еслиwatch
энтропия потребляется при каждом чтении, она должна постепенно уменьшаться.cat
теоретически должен иметь такой же энтропийный сток, который не должен быть виден. Оказывается, энтропия перемещается в другой пул, когда существует «достаточная» энтропия.lsof - не лучший инструмент для мониторинга,
/dev/random
поскольку одно чтение процесса завершается за очень короткое время. Я не знаю хорошего метода получения информации о том, какой процесс выполняет чтение, но с помощьюinotify
него можно отслеживать , есть ли чтение.Здесь есть в основном два пути:
Получить сводку через N секунд с помощью:
Просмотр событий прямого доступа:
Ни один из них не даст вам процесс, а последний не даст вам размер прочитанного. Первый даст вам резюме, как в:
Если у вас есть что работает и сделать
dd if=/dev/random of=/tmp/foo bs=1 count=3
, вы получите идею.Так или иначе. Это не даст вам галочки, когда ядро потребляет из пула.
Когда дело доходит до проверки состояния энтропии с помощью
не лучшая идея, поскольку каждый
cat
собирается потреблять энтропию. (Я вижу, что теперь выскочил другой ответ, в котором также упоминается об этом.) У меня также есть некоторый C-код для этого и я пытался найти его вчера. Я посмотрю, смогу ли я найти его и обновить ответ позже.источник
/dev/random
(я знаю, что на этом сайте есть похожие примеры).watch cat
:use Fcntl 'SEEK_SET'; open(my $fh,"<", "/proc/sys/kernel/random/entropy_avail"); while (1) { print <$fh>; sleep(1); seek($fh,0,SEEK_SET); }