Иногда я хочу много случайных данных, например, чтобы перезаписать файл или даже весь жесткий диск. Должен ли я использовать /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
если вам не нужно, чтобы данные были неотличимы от действительно случайного шума на протяжении десятилетий.