Пул энтропии ядра Linux и /dev/urandom

задняя часть алгоритм Linux API

Из компьютерных случайных чисел

Мы знаем, что компьютер — это предсказуемая система, поэтому с помощью алгоритмов невозможно генерировать действительно случайные числа. В компьютерах так называемые случайные числа обычно представляют собой псевдослучайные числа, которые рассчитываются случайными алгоритмами и могут быть аппроксимированы как случайные числа. Обычные алгоритмы случайных чисел включают линейный конгруэнтный генератор, скручивание Мерсенна и т. д. Первый алгоритм используется большинством компиляторов, и его случайность относительно плохая, второй — лучший алгоритм случайных чисел, который имеет хорошую случайность и используется в качестве случайного алгоритма по умолчанию. алгоритм такими языками, как Python и Ruby.

Однако очевидны и недостатки случайных алгоритмов. С одной стороны, алгоритм с большей случайностью более сложен в вычислительном отношении, с другой стороны, как бы ни была хороша случайность, она не может сравниться с реальным случайным числом. Поэтому генерация действительно случайных чисел — самый идеальный метод.

Пул энтропии ядра Linux

Ядро Linux использует энтропию для описания случайности данных. В физике энтропия — физическая величина, описывающая степень хаотичности системы: чем больше энтропия, тем более неупорядочена, хаотична система и тем больше неопределенность.

Хотя сам компьютер предсказуем, операционная среда компьютера полна различных непредсказуемых шумов, таких как шум от драйверов устройств, случайные интервалы щелчков мышью, время прерывания аппаратных устройств и так далее.

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

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

/dev/urandom

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

Использование /dev/random для генерации случайных чисел может привести к блокировке приложения. К счастью, в Linux есть еще один генератор случайных чисел /dev/urandom, это символьное устройство является неблокирующей версией /dev/random, если быть точным, это генератор псевдослучайных чисел, и его начальное число случайных чисел поступает из Entropy. pool, но даже если пул энтропии пуст, /dev/urandom все равно может генерировать случайные числа.

В руководстве Linux man(4) сказано:

/dev/random 是一个遗留下来的接口,在所有使用场景中,/dev/urandom 更受欢迎并且能满足要求。

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

Устранение блокировки, вызванной /dev/random

В настоящее время все еще есть некоторые приложения, которые используют /dev/random для генерации случайных чисел, и эти приложения могут блокироваться из-за исчерпания пула энтропии во время выполнения. Например, версии выше tomcat 7.0 полагаются на этот генератор для генерации случайных чисел и могут не отвечать при запуске, по сути, они ждут, когда энтропийный пул соберет шум. Кроме того, strongSwan генерирует ЦС, используяipsec pkiКоманды также могут блокироваться из-за этого.

Проблема решается установкой программы havged. haveged — это простой в использовании генератор непредсказуемых случайных чисел, основанный на алгоритме HAVEGE. haveged может решить проблему низкой энтропии системы в некоторых случаях.

Обратитесь к руководству человека

random(4) - Linux manual page

Статьи по Теме