Чому мій / dev / випадковий настільки повільний під час використання 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

Або щось подібне ...


1
Як зауваження: якщо ви не підозрюєте, що ЦРУ піде за вашими даними, певного перезапису нулів (/ dev / zero), ймовірно, достатньо. Дивіться, наприклад, superuser.com/questions/215852/… для обговорення.
sleske

Щодо того, чому читання /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.

ОНОВЛЕННЯ : Сторінка `випадкової (4) людини була оновлена ​​з моменту написання. Тепер написано:

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

Дивіться також " Міфи про / dev / urandom " Томаса Гюна.

Але /dev/urandom, хоча він і не блокується, швидше за все, це буде занадто повільно, якщо ви хочете генерувати величезну кількість даних. Зробіть кілька вимірювань у вашій системі, перш ніж спробувати.

EDIT: Далі подається відступ від "справжніх" випадкових чисел проти псевдовипадкових чисел. Якщо все, що вас цікавить, - це практична відповідь на запитання, ви можете перестати читати зараз.

Мені здається, твердження (в тому числі в інших відповідях тут), що /dev/randomреалізує "справжній" генератор випадкових чисел, на відміну від генератора псевдовипадкових чисел (PRNG). Наприклад, стаття у Вікіпедії висуває таку претензію. Я не вірю, що це правильно. Там якась - то дискусія про нього тут , який відноситься до апаратних генераторів випадкових чисел, але я не бачу ніяких доказів того, що /dev/randomзазвичай використовується такий пристрій, або що типові комп'ютери навіть є такий пристрій. Вони відрізняються від PRNG, як-от rand()функція C тим, що вони не детерміновані, оскільки отримують ентропію з джерел, які практично непередбачувані.

Я б сказав, що є три класи генераторів "випадкових" чисел:

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

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

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


2
Навіть / dev / urandom є якоюсь повільною, якщо вам доведеться заповнити величезну кількість дискового простору (як цілі розділи, перш ніж створювати на них зашифровані файлові системи). Це слід сприймати як невелике доповнення до відмінної відповіді та детального пояснення.
vtest

Оскільки ви не можете обчислити / вивести / створити / ... більше одного біта ентропії з одного випадкового біта, все, що генерує / виводить більше 'випадкових' бітів, ніж отримано як вхід, за визначенням є псевдовипадковим в кращому випадку. Отже, /dev/urandomявно псевдовипадкова. /dev/randomвідрізняється тим, що намагається зробити консервативну оцінку ентропії свого входу і не дає більшого рівня ентропії, ніж це (думає, що насправді). Це не залежить від наявності спеціального пристрою TRNG, оскільки справжня ентропія також може бути отримана від незалежних подій будь-якого типу, таких як клавіатура або мережевий IO проти часу.
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 поверне лише випадкові байти в межах приблизної кількості біт шуму в пулі ентропії. Це пояснює вашу проблему.

Деякі реалізації апаратної RNG пояснюються в документі ядра та інформації на пристрої .

Аналогом / dev / random є / dev / urandom ("розблокований" / не блокуючий випадковий джерело), ​​який повторно використовує внутрішній пул для отримання більшої кількості псевдовипадкових бітів. Це означає, що виклик не блокується, але вихід може містити меншу ентропію, ніж відповідне зчитування з / dev / random.

Отже, якщо ваш намір не генерувати CSPRNG (криптографічно захищений генератор псевдовипадкових чисел), вам слід використовувати / dev / urandom.


Чи /dev/randomсправді використовуються такі джерела, як тепловий шум? Я розумію, що вона використовує інформацію з (відносно) непередбачуваного стану системи, наприклад, активності вводу / виводу та стану процесу. Я не думаю, що в більшості систем Linux навіть є обладнання, яке може видавати тепловий шум. Чи можете ви навести певну документацію щодо цього?
Кіт Томпсон

так, ти правий. Інформація, яку я згадав, стосується загального апаратного генератора випадкових чисел.
Сачин Дівекар

Подивіться на документ про те, як він реалізований у Linux за посиланням . Там зазначається, що в середовищі ПК LRNG збирає ентропію від подій, що походять від перерв клавіатури, миші, диска та системи. В інших середовищах LRNG збирає ентропію з доступних ресурсів. Наприклад, маршрутизатор OpenWRT не включає жорсткий диск, мишу та клавіатуру, тому вони не можуть використовуватися як джерела ентропії. З іншого боку, маршрутизатор збирає ентропію від мережевих подій.
Сахін Дівекар

Можливо, ви могли б оновити свою відповідь. Я не вірю, що можна точно сказати, що /dev/randomгенерує "справді випадкові числа".
Кіт Томпсон

/ dev / random article у wikipedia говорить, що Linux був першою операційною системою, яка реалізувала справжній генератор випадкових чисел таким чином у першому абзаці.
Сачин Дівекар

2

Без відповіді на ваше запитання - тут вже є повні відповіді - ви також можете перевірити завантаження Darik і Nuke aka DBAN, який є склоочисником живого CD-диска.


0

Просто скористайтеся shredкомандою, яка постачається з coreutils. Він ефективно використовує випадкові дані. dd - інструмент низького рівня, і це, мабуть, трохи занадто низький рівень для цього завдання. shredнаприклад, ефективно пропустить непридатні частини пристрою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.