Должен ли я использовать "/dev/random" или "/dev/urandom" для больших случайных данных?

Иногда я хочу получить много случайных данных, например, перезаписать файл или даже весь жесткий диск. Должен ли я использовать /dev/random или же /dev/urandom? Каковы преимущества или недостатки каждого? Есть ли лучшая альтернатива?

1 ответ

Решение

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

И то и другое /dev/random а также /dev/urandom предоставить непредсказуемые (случайные) данные. Данные из /dev/random предназначен для того, чтобы быть совершенно непредсказуемым (или действительно случайным), что делает его пригодным для таких вещей, как долгосрочные криптографические ключи (где злоумышленник в будущем может иметь преимущества обширных исследований и гораздо более быстрых компьютеров, чтобы попытаться сломать алгоритм, используемый для генерации данные). Данные из /dev/urandom основана на действительно случайных данных, но может быть выполнена с помощью высококачественной псевдослучайной функции для получения дополнительных данных. Он по-прежнему подходит для таких вещей, как ключи шифрования, если вам не нужно быть уверенным, что они не будут взломаны в течение десятилетий, но его также можно использовать для массовых данных.

Ядро Linux поддерживает "энтропийный пул" непредсказуемых данных, в котором каждый бит имеет одинаковую вероятность быть истинным или ложным (один или ноль). Ядро создает этот пул энтропии из различных входных данных, таких как аппаратные источники, драйверы, действия пользователя и все остальное, что нельзя предсказать надежно. Однако этим источникам требуется время для накопления энтропии, поэтому пул энтропии может быть исчерпан, если он потребляется слишком быстро.

/dev/random рисует прямо из энтропийного пула. Когда пул исчерпан, чтение из /dev/random больше не возвращает данные, пока пул не заполнится достаточно, что может занять довольно много времени. /dev/urandom использует криптографически безопасный генератор псевдослучайных чисел (CSPRNG), выделенный из пула энтропии. Он может генерировать бесконечное количество выходных данных, но выходной нельзя предсказать, не зная внутреннего состояния CSPRNG. Поскольку внутреннее состояние изначально основано на действительно случайных данных, а используемый алгоритм CSPRNG разработан таким образом, чтобы не пропускать его внутреннее состояние через свои выходные данные, /dev/urandom по-прежнему является хорошим источником весьма случайных данных.

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

Другие вопросы по тегам