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

25483
Mikey

Я пытаюсь полубезопасно стереть кучу жестких дисков. Следующее работает на 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 

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

27
Как примечание: если вы не подозреваете, что ЦРУ преследует ваши данные, возможно, достаточно одного перезаписи на нули (/ dev / zero). См., Например, http://superuser.com/questions/215852/is-using-multiple-passes-for-wiping-a-disk-really-neally для обсуждения. sleske 12 лет назад 1
Что касается того, почему чтение из `/ dev / random` возвращает только несколько байтов, см. Http://superuser.com/a/712515/139307 mklement0 9 лет назад 0

5 ответов на вопрос

41
Keith Thompson

Оба /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что урожай энтропия из некоторого источника практически непредсказуемого подобной активности I / O (вот почему стучать по клавиатуре или перемещение мыши может вызвать /dev/randomдля получения большего количества данных). Не ясно (мне) они удовлетворяют ли определение ПСЧ (я видел определений, которые говорят ГСЧ является детерминированным), но они также не истинные генераторы случайных чисел.

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

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

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

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

Нет, `/ dev / random` не генерирует" действительно случайные байты ". Он генерирует более качественные * псевдо * -лучайные байты, чем `/ dev / urandom`. Keith Thompson 12 лет назад 9
7
Sachin Divekar

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

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

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

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

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

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

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

Использует ли `/ dev / random` такие источники, как тепловой шум? Насколько я понимаю, он использует информацию из (относительно) непредсказуемого состояния системы, такого как активность ввода-вывода и состояние процесса. Я не думаю, что в большинстве систем Linux есть даже оборудование, которое может собирать тепловые шумы. Можете ли вы привести некоторые документы по этому вопросу? Keith Thompson 12 лет назад 0
да ты прав. Информация, которую я упомянул, применима для общего аппаратного генератора случайных чисел. Sachin Divekar 12 лет назад 0
Посмотрите на документ о том, как это реализовано в Linux на [ссылка] (http://eprint.iacr.org/2006/086.pdf). Там упоминается, что в среде ПК LRNG собирает энтропию от событий, происходящих от клавиатуры, мыши, диска и системных прерываний. В других средах LRNG собирает энтропию из доступных ресурсов. Например, маршрутизатор OpenWRT не включает в себя жесткий диск, мышь и клавиатуру, и поэтому их нельзя использовать в качестве источников энтропии. С другой стороны, маршрутизатор собирает энтропию от сетевых событий. Sachin Divekar 12 лет назад 0
Возможно, вы могли бы обновить свой ответ. Я не верю, что точно сказать, что `/ dev / random` генерирует" действительно случайные числа ". Keith Thompson 12 лет назад 0
В [/dev/random](http://en.wikipedia.org/wiki//dev/random) статье в Википедии говорится, что Linux была первой операционной системой, которая реализовала настоящий генератор случайных чисел таким способом в первом абзаце. Sachin Divekar 12 лет назад 0
Я считаю, что статья в Википедии * задыхается * неправильно, говоря, что `/ dev / random` реализует« генератор истинных случайных чисел ». Здесь есть некоторое обсуждение [http://en.wikipedia.org/wiki/Talk:/dev/random#Did_you_say_.22true_random_number_generator.22_.3F). Я не вижу доказательств того, что `/ dev / random` использует какой-либо аппаратный RNG (хотя я полагаю, что он настроен на это, если он у вас есть). Keith Thompson 12 лет назад 0
@KeithThompson, спасибо. Поэтому я меняю свой первоначальный ответ. Я нашел несколько ссылок, касающихся реализации h / w RNG, [kernel doc] (http://www.kernel.org/doc/Documentation/hw_random.txt) и [устройство] (http://warmcat.com/_wp / whirlygig-RNG /). Sachin Divekar 12 лет назад 0
2
Randy Orrison

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

0
pixelbeat

Just use the shred command that comes with coreutils. It uses random data in an efficient way. dd is a low level tool and that's probably a bit too low level for this task. shred will efficiently skip unwritable portions of the device for example.

Похожие вопросы