Dd kullanırken / dev / random komutum neden bu kadar yavaş?


29

Bir grup sabit sürücüyü yarı güvenli bir şekilde silmeye çalışıyorum. Aşağıdaki 20-50Mb / s'de çalışıyor

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

Fakat

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

çalışmıyor gibi görünüyor. Ayrıca yazarken

dd if=/dev/random of=stdout

Bs = ve count = için ne ilettiğimden bağımsız olarak sadece birkaç bayt verir.

Yanlış / dev / random kullanıyor muyum? Bu sorun gidermeyi ileriye taşımak için başka hangi bilgileri aramalıyım? Bunu bir komut dosyasıyla veya benzeri bir şeyle yapmanın başka bir yolu var mı?

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

Ya da böyle bir şey...


1
Bir not gibi: CIA'nın verilerinizin peşinden gideceğinden şüphelenmiyorsanız, sıfır (/ dev / zero) olan tek bir üstüne yazmanız yeterli olacaktır. Bir tartışma için bkz . Superuser.com/questions/215852/… .
sleske

Neden /dev/randomsadece birkaç bayttan okuma
geliyorsa

Yanıtlar:


42

Her ikisi de /dev/randomve /dev/urandombir "entropy havuzu" kullanın. Havuz bittiğinde, /dev/randomsistemin davranışını izlemek (klavye girişi, fare hareketi vb.) Gerektiren yeniden dolmasını bekler, oysa /dev/urandomsize sahte rastgele veri vermeye devam eder. /dev/randomteorik olarak daha kaliteli, ancak /dev/urandomneredeyse kesinlikle amaçlarınız için yeterince iyi. (Ancak /dev/urandommuhtemelen diğer bazı yöntemlerden daha yavaş olabilir. Daha hızlı, ancak daha düşük kalitede bir jeneratör, sabit diskleri silmek için muhtemelen yeterince iyidir. Bir saldırganın oluşturulacak diziyi bilmekten herhangi bir avantaj kazanacağı açık değildir veya rastgele sayılar bu amaç için 0, 1, 2, 3, 4, .... gibi bir diziden daha iyidir . )

random(4)Man sayfasından alıntı :

Kullanmak gerektiği konusunda emin değilseniz /dev/randomya /dev/urandom, o zaman muhtemelen ikincisi kullanmak istiyorum. Genel bir kural olarak, /dev/urandomuzun ömürlü GPG / SSL / SSH anahtarları dışındaki her şey için kullanılmalıdır.

GÜNCELLEME : `Rasgele (4) kılavuz sayfası, bunu yazdığımdan beri güncellendi. Şimdi diyor ki:

/dev/randomArayüz eski arayüzü olarak kabul edilir ve /dev/urandomerken önyükleme işlemi sırasında rastgeleliğine gerektiren uygulamalar hariç olmak üzere, tercih ve tüm kullanım durumları yeterli olduğu; Bu uygulamalar için, getrandom(2)bunun yerine kullanılmalıdır, çünkü entropi havuzu başlatılana kadar engelleyecektir.

Ayrıca bkz . Thomas Hühn'in " / dev / urandom hakkındaki mitler "

Ancak /dev/urandom, engellemese de, çok büyük miktarda veri üretmek istiyorsanız çok yavaş olması muhtemeldir. Denemeden önce sisteminizde bazı ölçümler alın.

EDIT: Aşağıdaki "gerçek" rastgele sayılar vs sözde rastgele sayılar üzerinde bir rakamdır. İlgilendiğiniz tüm soruya pratik bir cevap ise, şimdi okumayı bırakabilirsiniz.

/dev/randomSözde rasgele sayı üretecinin (PRNG) aksine, "gerçek" rastgele sayı üretecini uygulayan iddiaları (buradaki diğer cevaplar dahil ). Örneğin, Wikipedia makalesi böyle bir iddiada bulunuyor. Bunun doğru olduğuna inanmıyorum. Orada bir kısmı bir tartışma burada donanım rasgele sayı üreteçleri anlamına gelir ama bu hiçbir kanıt bkz /dev/randomtipik böyle bir cihaz kullanan, ya da tipik bilgisayarlar bile böyle bir cihaz olması. rand()Entropiyi pratikte öngörülemeyen kaynaklardan topladıkları için deterministik olmadıkları için C işlevi gibi PRNG'lerden farklıdırlar .

Üç "rasgele" sayı üreteci sınıfı olduğunu söyleyebilirim:

  1. Belirli rand()bir rastgele dizinin istatistiksel özelliklerine sahip olan (az ya da çok) tekrarlanabilir dizileri üretmek için bir algoritma kullanan C'nin fonksiyonu gibi deterministik PRNG'ler . Bunlar oyunlar için yeterince iyi olabilir (iyi bir tohumlama şekli verilebilir) ve tekrarlanabilirlik gerektiren uygulamalar için gereklidir, ancak şifreleme için uygun değildirler.

  2. Gibi /dev/randomve /dev/urandombu girişimler, giriş / çıkış faaliyeti gibi pratik olarak öngörülemeyen bir kaynaktan entropi toplar (bu nedenle klavyeye vurma veya fareyi hareket ettirme /dev/randomdaha fazla veri üretmeye neden olabilir ). Bunların bir PRNG'nin tanımını sağlayıp sağlamadığı belli değil (benim için bir PRNG'nin deterministik olduğunu söyleyen tanımları gördüm), ama ikisi de gerçek rasgele sayı üreteçleri değil.

  3. Fiziksel olarak öngörülemeyen ve başlangıçtaki durumlarını tam olarak bildiği halde rasgele sayı üreteçleri ve ayrıca doğru istatistiksel özellikleri sağlamak için matematiksel teknikler kullanıyorlar.


2
Hatta / dev / urandom, çok büyük miktarda disk alanı doldurmanız gerekiyorsa, bunlar üzerinde şifreli dosya sistemleri oluşturmadan önce bütün bölümler gibi) biraz yavaşlar. Bu, mükemmel cevaba ve ayrıntılı açıklamaya küçük bir ekleme olarak alınmalıdır.
5'de

Bir rastgele bitten birden fazla entropi biti / türetme / yaratma / ... hesaplayamadığınız için, girdi olarak aldığıdan daha fazla "rastgele" bit üreten / çıkaran herhangi bir şey en iyi şekilde sahte rastgele tanım gereğidir. Bu nedenle, /dev/urandomaçıkça sözde rastgele. /dev/randomgirişinin entropisinin muhafazakar bir tahminde bulunmaya çalıştığı ve gerçekte olduğundan daha fazla entropi üretmediği için farklıdır. Bu, özel bir TRNG cihazının varlığından bağımsızdır, çünkü gerçek entropi, klavye veya ağ IO gibi zaman gibi her türlü bağımsız olaydan da elde edilebilir.
JimmyB

13

/dev/randomgerçek bir entropi kaynağıdır, gerçekten rastgele baytlardır. Bu nedenle, rastgele bir kaynağa ihtiyacı var. Ondan okuyarak rastgelelığı 'kullanabilirsiniz'. Size sahip olduğu tüm rasgeleliği verecektir, daha fazlası elde edene kadar engelleyin. Muhtemelen orada oturup beklemede kalıyorsunuz ve makine çok az yeni rastgelelik alıyor ve beklemektedir.

/dev/randomGerçekten rastgele kripto için, yüksek kaliteli rastgele. Gibi, bir disk sürücüsü üzerine yazmak için bir overkill. /dev/zeroBirkaç kez yazmak iyidir. Veya /dev/urandomengellemeyecek ve gerçek rastgelelik bittiğinde sahte rasgele sayılar veren , yazabilirsiniz .


10
Hayır, /dev/random"gerçekten rastgele bayt" oluşturmaz. Ondan daha yüksek kaliteli sözde -random bayt üretir /dev/urandom.
Keith Thompson

7

Linux'ta / dev / random, yüksek kaliteli sahte rastgele sayılar sunan özel bir dosyadır. Bu uygulama, entropiyi klavye, fare, disk ve sistem kesintilerinden kaynaklanan olaylardan toplar. ( bu belgeye bakın ) Yani böyle bir olay olmadığında, entropi havuzu boştur, / dev / random'dan okur, ek çevresel gürültü toplanana kadar engeller. Bu, probleminizi açıklar. Entropi havuzunu doldurmak için klavyedeki tuşlara basabilirsiniz.

Diğer taraftan, gerçekten rastgele bir sayı üreteci , fiziksel işlemlerden rasgele sayılar üreten Donanım rastgele sayı üreteci kullanır. Bu işlemler, termal gürültü veya fotoelektrik etki veya diğer fiziksel olaylar. Bu süreçler teoride tamamen öngörülemezdir ve teorinin öngörülemezliği iddiaları deneysel teste tabidir.

Bir donanım rastgele sayı üreteci, tipik olarak, fiziksel olayların bir kısmını elektriksel bir sinyale, bir yükselticiyi ve rastgele dalgalanmaların genliğini bir makroskopik seviyeye yükseltmek için bir başka elektronik devreyi ve bir tür analog-dijital dönüştürücüyü dönüştürmek için bir transdüserden oluşur. Çıktıyı dijital bir sayıya dönüştürmek için, genellikle 0 veya 1 olan basit bir ikili rakam.

Donanım Rasgele Sayı Üreticisi, aygıt sürücülerinden ve diğer kaynaklardan gelen çevresel gürültüyü bir entropi havuzuna toplar. Bu entropi havuzundan rasgele sayılar oluşturulur. Okunduğunda, / dev / random cihazı sadece entropi havuzundaki tahmini gürültü bit sayısı içindeki rastgele baytları döndürür. Bu, probleminizi açıklar.

Donanım RNG'nin bazı uygulamaları çekirdek dokümanda ve bir cihazdaki bilgilerde açıklanmıştır .

/ Dev / random'a karşılık gelen, / dev / urandom'dur ("kilitlenmemiş" / engelleyici olmayan rastgele kaynak), iç havuzu daha fazla sahte rastgele bit üretmek için yeniden kullanır. Bu, çağrının engellenmeyeceği, ancak çıkışın / dev / random'dan gelen okumadan daha az entropi içerebileceği anlamına gelir.

Bu nedenle amacınız CSPRNG (Kriptografik olarak güvenli sözde rasgele sayı üreteci) oluşturmak değilse, / dev / urandom kullanmanız gerekir.


/dev/randomGerçekten termal gürültü gibi kaynakları kullanıyor mu ? Anladığım kadarıyla G / Ç faaliyeti ve işlem durumu gibi (nispeten) öngörülemeyen sistem durumundan gelen bilgileri kullanıyor. Çoğu Linux sisteminin termal gürültüyü artırabilecek donanıma sahip olduğunu sanmıyorum. Bununla ilgili bazı belgelerden alıntı yapabilir misiniz?
Keith Thompson

Evet haklısın. Bahsettiğim bilgiler genel Donanım Rastgele Sayı Üreticisi için geçerlidir.
Sachin Divekar

Dokümanda linux’un linkte nasıl uygulandığına bakın . Burada bir PC ortamında, LRNG'nin klavye, fare, disk ve sistem kesintilerinden kaynaklanan olaylardan entropi topladığı belirtilmektedir. Diğer ortamlarda, LRNG mevcut kaynaklardan entropiyi toplar. Örneğin, bir OpenWRT yönlendirici bir sabit disk, fare ve klavyeyi içermez ve bu nedenle bunlar bir entropi kaynağı olarak kullanılamaz. Öte yandan, yönlendirici entropiyi ağ olaylarından toplar.
Sachin Divekar 22:11

Belki de cevabınızı güncelleyebilirsiniz. /dev/random"Gerçekten rastgele sayılar" ürettiğini söylemenin doğru olduğuna inanmıyorum .
Keith Thompson

wikipedia'daki / dev / random makalesinde, Linux ilk paragrafta bu şekilde gerçek bir rasgele sayı üreteci uygulayan ilk işletim sistemi olduğunu söylüyor.
Sachin Divekar


0

Sadece shredcoreutils ile gelen komutu kullanın . Rasgele verileri etkili bir şekilde kullanır. dd düşük seviye bir araçtır ve bu görev için muhtemelen biraz düşük bir seviyedir. shredÖrneğin cihazın istenmeyen kısımlarını etkin bir şekilde atlayacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.