Mengapa / dev / random saya sangat lambat saat menggunakan dd?

29

Saya mencoba menghapus semi-aman sekelompok hard drive. Berikut ini berfungsi pada 20-50Mb / s

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

Tapi

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

sepertinya tidak bekerja. Juga saat saya mengetik

dd if=/dev/random of=stdout

Itu hanya memberi saya beberapa byte terlepas dari apa yang saya berikan untuk bs = dan hitung =

Apakah saya menggunakan / dev / salah acak? Info apa lagi yang harus saya cari untuk memajukan pemecahan masalah ini? Apakah ada cara lain untuk melakukan ini dengan skrip atau semacamnya

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

Atau semacam itu...

Mikey
sumber
1
Sama seperti catatan: Kecuali Anda mencurigai CIA mengejar data Anda, satu timpa dengan nol (/ dev / nol) mungkin cukup. Lihat misalnya superuser.com/questions/215852/… untuk diskusi.
sleske
Adapun mengapa membaca dari /dev/randomhanya mengembalikan beberapa byte, lihat superuser.com/a/712515/139307
mklement0

Jawaban:

42

Keduanya /dev/randomdan /dev/urandommenggunakan "kolam entropi". Ketika pool habis, /dev/randomtunggu sampai diisi ulang, yang membutuhkan perilaku sistem pemantauan (input keyboard, pergerakan mouse, dll.), Sedangkan /dev/urandomakan terus memberi Anda data pseudo-acak. /dev/randomsecara teori kualitasnya lebih tinggi, tetapi /dev/urandomhampir pasti cukup bagus untuk keperluan Anda. (Tetapi bahkan /dev/urandommungkin lebih lambat dari beberapa metode lain. Generator yang lebih cepat, tetapi lebih rendah, kualitasnya mungkin cukup baik untuk menghapus hard drive. Tidak jelas bahwa penyerang akan mendapatkan keuntungan dari mengetahui urutan yang akan dihasilkan, atau bahwa angka acak lebih baik untuk tujuan ini daripada urutan seperti 0, 1, 2, 3, 4, ....)

Mengutip random(4)halaman manual:

Jika Anda tidak yakin tentang apakah Anda harus menggunakan /dev/randomatau /dev/urandom, maka mungkin Anda ingin menggunakan yang terakhir. Sebagai aturan umum, /dev/urandomharus digunakan untuk semuanya kecuali kunci GPG / SSL / SSH yang berumur panjang.

UPDATE : Halaman manual `acak (4) telah diperbarui sejak saya menulis itu. Sekarang tertulis:

The /dev/randomantarmuka dianggap sebagai antarmuka warisan, dan /dev/urandomlebih disukai dan memadai dalam semua kasus penggunaan, dengan pengecualian dari aplikasi yang memerlukan keacakan selama waktu boot awal; untuk aplikasi ini, getrandom(2)harus digunakan sebagai gantinya, karena akan memblokir sampai kumpulan entropi diinisialisasi.

Lihat juga " Mitos tentang / dev / urandom " oleh Thomas Hühn.

Tetapi /dev/urandom, meskipun itu tidak akan diblokir, kemungkinan akan terlalu lambat jika Anda ingin menghasilkan data dalam jumlah besar. Lakukan beberapa pengukuran pada sistem Anda sebelum mencobanya.

EDIT: Berikut ini adalah penyimpangan pada nomor acak "benar" vs nomor pseudo-acak. Jika semua yang Anda minati adalah jawaban praktis untuk pertanyaan itu, Anda bisa berhenti membaca sekarang.

Sepertinya saya telah mengklaim (termasuk dalam jawaban lain di sini) yang /dev/randommengimplementasikan generator nomor acak "benar", sebagai lawan dari generator nomor acak semu (PRNG). Sebagai contoh, artikel Wikipedia membuat klaim seperti itu. Saya tidak percaya itu benar. Ada beberapa diskusi tentang hal ini di sini yang mengacu pada generator nomor acak perangkat keras, tetapi saya tidak melihat bukti yang /dev/randombiasanya menggunakan perangkat seperti itu, atau bahwa komputer biasa bahkan memiliki perangkat seperti itu. Mereka berbeda dari PRNG seperti rand()fungsi C karena mereka tidak deterministik, karena mereka mengambil entropi dari sumber yang secara praktis tidak dapat diprediksi.

Saya akan mengatakan ada tiga kelas generator nomor "acak":

  1. PRNG deterministik, seperti rand()fungsi C , yang menggunakan algoritma untuk menghasilkan urutan berulang yang memiliki (kurang lebih) sifat statistik dari urutan yang benar-benar acak. Ini bisa cukup baik untuk gim (diberikan cara yang baik untuk menaburnya), dan diperlukan untuk aplikasi yang membutuhkan pengulangan, tetapi tidak cocok untuk kriptografi.

  2. Generator menyukai /dev/randomdan mengambil /dev/urandomentropi dari sumber yang praktis tidak dapat diprediksi seperti aktivitas I / O (inilah sebabnya menggedor keyboard atau menggerakkan mouse dapat menyebabkan /dev/randommenghasilkan lebih banyak data). Tidak jelas (bagi saya) apakah ini memenuhi definisi PRNG (Saya telah melihat definisi yang mengatakan PRNG adalah deterministik), tetapi mereka juga tidak benar - benar menghasilkan bilangan acak.

  3. Generator nomor acak perangkat keras yang secara fisik tidak dapat diprediksi bahkan dengan pengetahuan lengkap tentang keadaan awal mereka, dan yang tambahan menggunakan teknik matematika untuk memastikan sifat statistik yang tepat.

Keith Thompson
sumber
2
Bahkan / dev / urandom agak lambat jika Anda harus mengisi ruang disk yang sangat besar (seperti seluruh partisi, sebelum membuat sistem file terenkripsi di dalamnya). Ini harus diambil sebagai tambahan kecil untuk jawaban yang sangat baik dan penjelasan rinci.
vtest
Karena Anda tidak dapat menghitung / menurunkan / membuat / ... lebih dari satu bit entropi dari satu bit acak, apa pun yang menghasilkan / mengeluarkan lebih banyak bit 'acak' daripada yang diterima sebagai input menurut definisi pseudo-random yang terbaik. Oleh karena itu, /dev/urandomjelas pseudo-random. /dev/randomberbeda karena mencoba membuat estimasi konservatif dari entropi inputnya dan tidak menghasilkan lebih banyak entropi daripada yang sebenarnya (menurutnya). Ini tidak tergantung pada kehadiran perangkat TRNG yang berdedikasi, karena entropi sejati juga dapat diperoleh dari acara independen apa pun, seperti keyboard atau jaringan IO vs waktu.
JimmyB
13

/dev/randomadalah sumber entropi sejati, byte benar-benar acak. Karena itu, perlu sumber keacakan. Anda dapat 'menggunakan' keacakan dengan membaca darinya. Ini akan memberi Anda semua keacakan yang dimilikinya, kemudian memblokir sampai mendapat lebih banyak. Anda mungkin hanya duduk di sana menunggu, dan mesin mendapat sangat sedikit keacakan baru, dan itu hanya menunggu.

/dev/randomuntuk crypto benar-benar acak, keacakan kualitas tinggi. Dengan demikian, ini adalah overkill untuk menimpa drive disk. Menulis dari /dev/zerobeberapa kali tidak masalah. Atau Anda dapat menulis dari /dev/urandom, yang tidak akan memblokir dan memberikan angka pseudo-acak ketika kehabisan keacakan yang sebenarnya.

Homolka yang kaya
sumber
10
Tidak, /dev/randomtidak menghasilkan "byte benar-benar acak". Ini menghasilkan byte -random pseudo -random berkualitas lebih tinggi daripada yang /dev/urandomdilakukan.
Keith Thompson
7

Di Linux / dev / random adalah file khusus yang menyajikan nomor acak semu yang berkualitas tinggi. Implementasi ini mengumpulkan entropi dari acara yang berasal dari gangguan keyboard, mouse, disk, dan sistem. (rujuk dokumen ini ) Jadi, ketika tidak ada acara seperti itu, kumpulan entropi kosong, bacaan dari / dev / random akan diblokir hingga kebisingan lingkungan tambahan dikumpulkan. Ini menjelaskan masalah Anda. Untuk mengisi kumpulan entropi, Anda dapat menekan tombol pada keyboard.

Di sisi lain, generator angka acak menggunakan perangkat generator angka acak Perangkat Keras yang menghasilkan angka acak dari proses fisik. Proses ini termasuk fenomena mikroskopis yang menghasilkan sinyal "noise" tingkat rendah, acak secara statistik, seperti noise termal atau efek fotoelektrik atau fenomena fisik lainnya. Secara teori, proses-proses ini benar-benar tidak dapat diprediksi, dan pernyataan teori tentang tidak dapat diprediksi akan diuji secara eksperimental.

Generator nomor acak perangkat keras biasanya terdiri dari transduser untuk mengubah beberapa aspek fenomena fisik menjadi sinyal listrik, penguat, dan sirkuit elektronik lainnya untuk meningkatkan amplitudo fluktuasi acak ke tingkat makroskopis, dan beberapa jenis pengubah analog ke digital untuk mengubah output menjadi angka digital, seringkali digit biner sederhana 0 atau 1. Dengan berulang kali mengambil sampel sinyal yang berubah secara acak, serangkaian angka acak diperoleh.

Perangkat Penghasil Angka Acak Perangkat Keras mengumpulkan kebisingan lingkungan dari driver perangkat dan sumber lain ke dalam kumpulan entropi. Dari kumpulan entropi ini angka acak dibuat. Saat membaca, perangkat / dev / random hanya akan mengembalikan byte acak dalam perkiraan jumlah bit noise di kumpulan entropi. Ini menjelaskan masalah Anda.

Beberapa implementasi Hardware RNG dijelaskan dalam kernel doc dan informasi pada perangkat .

Mitra untuk / dev / random adalah / dev / urandom ("sumber tidak terkunci" / sumber acak yang tidak memblokir) yang menggunakan kumpulan internal untuk menghasilkan bit pseudo-acak yang lebih banyak. Ini berarti bahwa panggilan tersebut tidak akan memblokir, tetapi output mungkin mengandung lebih sedikit entropi daripada pembacaan yang sesuai dari / dev / random.

Jadi, jika maksud Anda bukan untuk menghasilkan CSPRNG (generator nomor pseudorandom yang aman secara kriptografis), Anda harus menggunakan / dev / urandom.

Sachin Divekar
sumber
Apakah /dev/randombenar-benar menggunakan sumber seperti noise termal? Pemahaman saya adalah bahwa ia menggunakan informasi dari (relatif) status sistem yang tidak dapat diprediksi, seperti aktivitas I / O dan status proses. Saya tidak berpikir sebagian besar sistem Linux bahkan memiliki perangkat keras yang dapat memanen noise termal. Bisakah Anda mengutip beberapa dokumentasi tentang ini?
Keith Thompson
ya kamu benar. Informasi yang saya sebutkan berlaku untuk Perangkat Keras Nomor Generator Generik.
Sachin Divekar
Lihatlah dokumen tentang bagaimana ini diterapkan di linux at link . Di sana disebutkan bahwa Dalam lingkungan PC, LRNG mengumpulkan entropi dari peristiwa yang berasal dari keyboard, mouse, disk, dan gangguan sistem. Di lingkungan lain, LRNG mengumpulkan entropi dari sumber daya yang tersedia. Misalnya, router OpenWRT tidak menyertakan hard disk, mouse, dan keyboard dan karenanya ini tidak dapat digunakan sebagai sumber entropi. Di sisi lain, router mengumpulkan entropi dari peristiwa jaringan.
Sachin Divekar
Mungkin Anda dapat memperbarui jawaban Anda. Saya tidak percaya itu akurat untuk mengatakan bahwa /dev/randommenghasilkan "angka yang benar-benar acak".
Keith Thompson
/ dev / artikel acak di wikipedia mengatakan, Linux adalah sistem operasi pertama yang mengimplementasikan generator nomor acak yang benar dengan cara ini pada paragraf pertama.
Sachin Divekar
2

Tanpa menjawab pertanyaan Anda - sudah ada jawaban lengkap di sini - Anda juga dapat melihat Boot Darik dan Nuke alias DBAN yang merupakan penghapus drive CD langsung.

Randy Orrison
sumber
0

Cukup gunakan shredperintah yang datang dengan coreutils. Ini menggunakan data acak dengan cara yang efisien. dd adalah alat level rendah dan itu mungkin level agak terlalu rendah untuk tugas ini. shredakan secara efisien melewati bagian perangkat yang tidak dapat ditulis misalnya.

pixelbeat
sumber