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

29

Я пытаюсь полубезопасно стереть кучу жестких дисков. Следующее работает на 20-50Мб / с

dd if=/dev/zero of=/dev/sda

Но

dd if=/dev/random of=/dev/sda 

Кажется, не работает. Также, когда я печатаю

dd if=/dev/random of=stdout

Это дает мне всего несколько байтов, независимо от того, что я передаю для bs = и count =

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

makeMyLifeEasy | dd if=stdin of=/dev/sda

Или что-то типа того...

Mikey
источник
1
Как примечание: если вы не подозреваете, что ЦРУ преследует ваши данные, возможно, достаточно одного перезаписи на нули (/ dev / zero). См. Например, superuser.com/questions/215852/… для обсуждения.
слеске
А почему чтение из /dev/randomвозвращает только несколько байтов, см superuser.com/a/712515/139307
mklement0

Ответы:

42

Оба /dev/randomи /dev/urandomиспользуют «пул энтропии». Когда пул заканчивается, он /dev/randomожидает его пополнения, что требует отслеживания поведения системы (ввод с клавиатуры, движение мыши и т. Д.), В то время как он /dev/urandomбудет по-прежнему выдавать псевдослучайные данные. /dev/randomтеоретически более высокого качества, но /dev/urandomпочти наверняка достаточно для ваших целей. (Но даже /dev/urandom, вероятно, будет медленнее, чем некоторые другие методы. Более быстрый, но менее качественный генератор, вероятно, достаточно хорош для стирания жестких дисков. Не ясно, что злоумышленник получит какое-либо преимущество от знания последовательности, которая будет сгенерирована, или что случайные числа лучше для этой цели, чем последовательность типа 0, 1, 2, 3, 4, ....)

Цитирую справочную random(4)страницу:

Если вы не уверены, следует ли вам использовать /dev/randomили /dev/urandom, то, вероятно, вы хотите использовать последний. Как правило, /dev/urandomследует использовать все, кроме долговечных ключей GPG / SSL / SSH.

ОБНОВЛЕНИЕ : страница man random (4) была обновлена ​​с тех пор, как я ее написал. Теперь говорится:

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

Смотрите также " Мифы о / dev / urandom " Томаса Хуна.

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

РЕДАКТИРОВАТЬ: Ниже приводится отступление от "истинных" случайных чисел против псевдослучайных чисел. Если все, что вас интересует, это практический ответ на вопрос, вы можете перестать читать сейчас.

Я, кажется, утверждаю (в том числе в других ответах здесь), что /dev/randomреализует «истинный» генератор случайных чисел, в отличие от генератора псевдослучайных чисел (PRNG). Например, статья Википедии делает такое утверждение. Я не верю, что это правильно. Там какая - то дискуссия о нем здесь , который относится к аппаратным генераторам случайных чисел, но я не вижу никаких доказательств того, что /dev/randomобычно используется такое устройство, или что типичные компьютеры даже есть такое устройство. Они отличаются от PRNG, таких как rand()функция C, тем, что они не являются детерминированными, поскольку они собирают энтропию из источников, которые практически непредсказуемы.

Я бы сказал, что есть три класса генераторов «случайных» чисел:

  1. Детерминированные PRNG, такие как rand()функция C , которые используют алгоритм для генерации повторяемых последовательностей, которые имеют (более или менее) статистические свойства действительно случайной последовательности. Они могут быть достаточно хороши для игр (учитывая хороший способ их заполнения) и необходимы для приложений, которые требуют повторяемости, но они не подходят для криптографии.

  2. Генераторы , как /dev/randomи /dev/urandomчто урожай энтропия из некоторого источника практически непредсказуемого , как активность ввода / вывода (именно поэтому стучать на клавиатуре или перемещение мыши может вызвать /dev/randomдля получения большего количества данных). Не ясно (мне) они удовлетворяют ли определение ПСЧ (я видел определений , которые говорят ГСЧ является детерминированным), но при этом они не истинные генераторы случайных чисел.

  3. Аппаратные генераторы случайных чисел , которые физически непредсказуемы даже с полным знанием их начального состояния, и которые дополнительно используют математические методы для обеспечения правильных статистических свойств.

Кит Томпсон
источник
2
Даже / dev / urandom довольно медленный, если вам нужно заполнить огромное количество дискового пространства (например, целые разделы перед созданием на них зашифрованных файловых систем). Это следует рассматривать как небольшое дополнение к отличному ответу и подробному объяснению.
вторник
Поскольку вы не можете вычислить / получить / создать / ... более одного бита энтропии из одного случайного бита, все, что генерирует / выводит больше «случайных» битов, чем получено в качестве входных данных, в лучшем случае по определению является псевдослучайным. Следовательно, /dev/urandomявно псевдослучайный. /dev/randomотличается тем, что он пытается сделать консервативную оценку энтропии входных данных и не выдает больше энтропии, чем может (думает) на самом деле. Это не зависит от наличия выделенного устройства TRNG, поскольку истинная энтропия также может быть получена из независимых событий любого типа, таких как ввод с клавиатуры или сети в зависимости от времени.
JimmyB
13

/dev/randomявляется источником истинной энтропии, действительно случайных байтов. Как таковой, он нуждается в источнике случайности. Вы можете «использовать» случайность, читая с нее. Это даст вам всю случайность, которую он имеет, затем блокирует, пока не получит больше. Вы, вероятно, просто сидите там в ожидании, и машина получает совсем немного новой случайности, и она просто ждет.

/dev/randomдля действительно случайной криптографии, случайности высокого качества. Таким образом, это избыточное количество дисков для перезаписи. Писать с /dev/zeroнескольких раз в порядке. Или вы можете написать с /dev/urandom, который не будет блокировать и дает псевдослучайные числа, когда он исчерпывает истинную случайность.

Рич Гомолка
источник
10
Нет, /dev/randomне генерирует «действительно случайные байты». Он генерирует более качественные псевдослучайные байты, чем /dev/urandomделает.
Кит Томпсон
7

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

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

Аппаратный генератор случайных чисел обычно состоит из преобразователя для преобразования некоторых аспектов физических явлений в электрический сигнал, усилителя и других электронных схем для увеличения амплитуды случайных колебаний до макроскопического уровня и некоторого типа аналого-цифрового преобразователя. для преобразования выходных данных в цифровое число, часто простую двоичную цифру 0 или 1. Путем многократной выборки случайно изменяющегося сигнала получается серия случайных чисел.

Аппаратный генератор случайных чисел собирает шум окружающей среды от драйверов устройств и других источников в пул энтропии. Из этого энтропийного пула создаются случайные числа. При чтении устройство / dev / random будет возвращать только случайные байты в пределах предполагаемого количества битов шума в пуле энтропии. Это объясняет вашу проблему.

Некоторые реализации Hardware RNG описаны в документации к ядру и информации об устройстве .

Аналогом / dev / random является / dev / urandom («разблокированный» / неблокирующий случайный источник), который повторно использует внутренний пул для генерации большего количества псевдослучайных битов. Это означает, что вызов не будет блокироваться, но выходные данные могут содержать меньше энтропии, чем соответствующее чтение из / dev / random.

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

Сачин Дивекар
источник
/dev/randomДействительно ли используются такие источники, как тепловой шум? Насколько я понимаю, он использует информацию из (относительно) непредсказуемого состояния системы, такого как активность ввода-вывода и состояние процесса. Я не думаю, что большинство систем Linux даже имеют оборудование, которое может собирать тепловые шумы. Можете ли вы привести некоторые документы по этому поводу?
Кит Томпсон
да ты прав. Информация, которую я упомянул, применима для общего аппаратного генератора случайных чисел.
Сачин Дивекарь
Посмотрите на документ о том, как это реализовано в Linux по ссылке . Там упоминается, что в среде ПК LRNG собирает энтропию от событий, происходящих от клавиатуры, мыши, диска и системных прерываний. В других средах LRNG собирает энтропию из доступных ресурсов. Например, маршрутизатор OpenWRT не включает в себя жесткий диск, мышь и клавиатуру, и поэтому их нельзя использовать в качестве источников энтропии. С другой стороны, маршрутизатор собирает энтропию от сетевых событий.
Сачин Дивекарь
Возможно, вы могли бы обновить свой ответ. Я не верю, что точно сказать, что /dev/randomгенерирует «действительно случайные числа».
Кит Томпсон
В статье / dev / random в Википедии говорится, что в первом параграфе Linux была первой операционной системой, которая реализовала настоящий генератор случайных чисел таким способом.
Сачин Дивекарь
2

Не отвечая на ваш вопрос - здесь уже есть полные ответы - вы также можете проверить загрузку Darik's Boot и Nuke aka DBAN, которая представляет собой очиститель дисковода для live-CD.

Рэнди Оррисон
источник
0

Просто используйте shredкоманду, которая поставляется с coreutils. Он использует случайные данные эффективным способом. dd - инструмент низкого уровня, и это, вероятно, слишком низкий уровень для этой задачи. shredэффективно пропустит неписываемые части устройства, например.

pixelbeat
источник