Dlaczego mój / dev / random jest taki wolny podczas korzystania z dd?

29

Próbuję częściowo bezpiecznie skasować kilka dysków twardych. Następujące działa przy prędkości 20-50 Mb / s

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

Ale

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

wydaje się nie działać. Również kiedy piszę

dd if=/dev/random of=stdout

Daje mi tylko kilka bajtów, niezależnie od tego, co przekazuję dla bs = i count =

Czy używam / dev / random źle? Jakich innych informacji powinienem szukać, aby przyspieszyć rozwiązywanie problemów? Czy jest jakiś inny sposób, aby to zrobić za pomocą skryptu lub czegoś podobnego

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

Czy jakoś tak...

Mikey
źródło
1
Uwaga: chyba że podejrzewasz, że CIA będzie śledzić twoje dane, prawdopodobnie wystarczy jedno zastąpienie zerami (/ dev / zero). Dyskusja znajduje się np. Superuser.com/questions/215852/ ...
sleske
Jeśli chodzi o to, dlaczego czytanie z /dev/randomtylko zwraca kilka bajtów, zobacz superuser.com/a/712515/139307
mklement0

Odpowiedzi:

42

Zarówno /dev/randomi /dev/urandomużyć „entropii basen”. Kiedy pula się wyczerpie, /dev/randomczeka na jej uzupełnienie, co wymaga monitorowania zachowania systemu (wprowadzania danych z klawiatury, ruchu myszy itp.), Podczas gdy /dev/urandomnadal będzie dostarczać pseudolosowe dane. /dev/randomjest teoretycznie wyższej jakości, ale /dev/urandomprawie na pewno jest wystarczająco dobry do twoich celów. (Ale nawet /dev/urandomprawdopodobnie jest wolniejszy niż niektóre inne metody. Szybszy, ale niższej jakości generator jest prawdopodobnie wystarczający do kasowania dysków twardych. Nie jest jasne, czy osoba atakująca zyska jakąkolwiek przewagę, wiedząc o sekwencji, która zostanie wygenerowana, lub że liczby losowe są w tym celu lepsze niż ciąg taki jak 0, 1, 2, 3, 4, ....)

Cytując random(4)stronę podręcznika :

Jeśli nie masz pewności, czy powinieneś użyć /dev/randomlub /dev/urandom, prawdopodobnie prawdopodobnie chcesz użyć tego drugiego. Zasadniczo /dev/urandompowinna być używana do wszystkiego oprócz długowiecznych kluczy GPG / SSL / SSH.

AKTUALIZACJA : Strona podręcznika `random (4) została zaktualizowana, odkąd to napisałem. Teraz mówi:

/dev/randomInterfejs jest uważany za interfejs dziedzictwo i /dev/urandomjest preferowana i wystarczający we wszystkich przypadkach użycia, z wyjątkiem zastosowań, które wymagają przypadkowość podczas wczesnego startu systemu; dla tych aplikacji getrandom(2)należy zamiast tego użyć, ponieważ będzie blokować do momentu zainicjowania puli entropii.

Zobacz także „ Mity o / dev / urandom ” Thomasa Hühna.

Ale /dev/urandomnawet jeśli się nie zablokuje, prawdopodobnie będzie zbyt wolny, jeśli chcesz wygenerować ogromne ilości danych. Wykonaj kilka pomiarów w swoim systemie przed wypróbowaniem.

EDYCJA: Poniżej znajduje się dygresja „prawdziwych” liczb losowych w porównaniu z liczbami pseudolosowymi. Jeśli interesuje Cię tylko praktyczna odpowiedź na pytanie, możesz teraz przestać czytać.

Wydaje mi się, że twierdzę (w tym w innych odpowiedziach tutaj), że /dev/randomimplementuje „prawdziwy” generator liczb losowych, w przeciwieństwie do generatora liczb pseudolosowych (PRNG). Na przykład taki artykuł w Wikipedii zawiera takie twierdzenie. Nie wierzę, że to prawda. Jest tu trochę dyskusji na ten temat , która dotyczy sprzętowych generatorów liczb losowych, ale nie widzę dowodów, że /dev/randomzwykle używa takiego urządzenia lub że typowe komputery nawet mają takie urządzenie. Różnią się od PRNG, takich jak rand()funkcja C, tym, że nie są deterministyczne, ponieważ zbierają entropię ze źródeł, które są praktycznie nieprzewidywalne.

Powiedziałbym, że istnieją trzy klasy „losowych” generatorów liczb:

  1. Deterministyczne PRNG, takie jak rand()funkcja C , które wykorzystują algorytm do generowania powtarzalnych sekwencji, które mają (mniej więcej) statystyczne właściwości prawdziwie losowej sekwencji. Mogą one być wystarczająco dobre dla gier (biorąc pod uwagę dobry sposób ich inicjowania) i są niezbędne dla aplikacji wymagających powtarzalności, ale nie nadają się do kryptografii.

  2. Generatory takie /dev/randomi /dev/urandomktóre pobierają entropię z jakiegoś praktycznie nieprzewidywalnego źródła, takiego jak aktywność we / wy (dlatego uderzenie w klawiaturę lub poruszenie myszą może spowodować /dev/randomwygenerowanie większej ilości danych). Nie jest dla mnie jasne, czy spełniają one definicję PRNG (widziałem definicje, które mówią, że PRNG jest deterministyczny), ale nie są też prawdziwymi generatorami liczb losowych.

  3. Sprzętowe generatory liczb losowych, które są fizycznie nieprzewidywalne, nawet przy pełnej wiedzy o ich stanie początkowym, i które dodatkowo wykorzystują techniki matematyczne, aby zapewnić odpowiednie właściwości statystyczne.

Keith Thompson
źródło
2
Nawet / dev / urandom jest dość powolny, jeśli musisz wypełnić ogromne ilości miejsca na dysku (jak całe partycje, zanim utworzysz na nich zaszyfrowane systemy plików). Należy to uznać za niewielki dodatek do doskonałej odpowiedzi i szczegółowego wyjaśnienia.
vtest
Ponieważ nie można obliczyć / wyprowadzić / utworzyć / ... więcej niż jednego bitu entropii z jednego bitu losowego, wszystko, co generuje / wyprowadza więcej „losowych” bitów niż otrzymanych jako dane wejściowe, jest z definicji pseudolosowe w najlepszym wypadku. Dlatego /dev/urandomwyraźnie jest pseudolosowy. /dev/randomróżni się tym, że próbuje dokonać konserwatywnego oszacowania entropii danych wejściowych i nie generuje więcej entropii, niż jest w stanie (tak myśli). Jest to niezależne od obecności dedykowanego urządzenia TRNG, ponieważ prawdziwą entropię można również uzyskać z niezależnych zdarzeń dowolnego rodzaju, takich jak IO klawiatury lub sieci w funkcji czasu.
JimmyB
13

/dev/randomjest źródłem prawdziwej entropii, prawdziwie losowych bajtów. Jako taki potrzebuje źródła losowości. Możesz „wykorzystać” losowość, czytając z niej. Daje ci całą losowość, którą ma, a następnie blokuje, aż będzie więcej. Prawdopodobnie po prostu siedzisz tam i czekasz, a maszyna dostaje bardzo mało nowej losowości i tylko czeka.

/dev/randomdla naprawdę losowego krypto, wysokiej jakości losowości. W związku z tym jest to nadmiar w przypadku nadpisywania dysku. Pisanie /dev/zerokilka razy jest w porządku. Lub możesz pisać z /dev/urandom, który nie blokuje i podaje liczby pseudolosowe, gdy zabraknie prawdziwej losowości.

Rich Homolka
źródło
10
Nie, /dev/randomnie generuje „prawdziwie losowych bajtów”. Generuje pseudolosowe bajty wyższej jakości niż /dev/urandomrobi.
Keith Thompson
7

W Linuksie / dev / random to specjalny plik, który obsługuje wysokiej jakości pseudolosowe liczby. Ta implementacja zbiera entropię ze zdarzeń pochodzących z przerwań klawiatury, myszy, dysku i systemu. (zapoznaj się z tym dokumentem) Jeśli więc nie ma takich zdarzeń, pula entropii jest pusta, odczyty z / dev / random będą blokowane do momentu zebrania dodatkowego hałasu otoczenia. To wyjaśnia twój problem. Aby wypełnić pulę entropii, możesz naciskać klawisze na klawiaturze.

Z drugiej strony prawdziwie losowy generator liczb wykorzystuje sprzętowy generator liczb losowych, który generuje liczby losowe z procesów fizycznych. Procesy te obejmują zjawiska mikroskopowe, które generują statystycznie losowy sygnał „szumu”, taki jak szum termiczny lub efekt fotoelektryczny lub inne zjawiska fizyczne. Te procesy są teoretycznie całkowicie nieprzewidywalne, a twierdzenia teorii o nieprzewidywalności podlegają testom eksperymentalnym.

Sprzętowy generator liczb losowych zwykle składa się z przetwornika do konwersji niektórych aspektów zjawisk fizycznych na sygnał elektryczny, wzmacniacza i innych układów elektronicznych w celu zwiększenia amplitudy wahań losowych do poziomu makroskopowego oraz pewnego rodzaju przetwornika analogowo-cyfrowego w celu przekształcenia wyjścia w liczbę cyfrową, często prostą cyfrę binarną 0 lub 1. Przez wielokrotne próbkowanie losowo zmieniającego się sygnału uzyskuje się szereg liczb losowych.

Sprzętowy generator liczb losowych gromadzi hałas otoczenia ze sterowników urządzeń i innych źródeł w puli entropii. Z tej puli entropii tworzone są losowe liczby. Podczas odczytu urządzenie / dev / random zwróci losowe bajty tylko w obrębie szacunkowej liczby bitów szumu w puli entropii. To wyjaśnia twój problem.

Niektóre implementacje Hardware RNG są wyjaśnione w dokumentacji jądra i informacjach na urządzeniu .

Odpowiednikiem / dev / random jest / dev / urandom („odblokowane” / nieblokujące losowe źródło), które ponownie wykorzystuje wewnętrzną pulę do wytwarzania większej liczby pseudolosowych bitów. Oznacza to, że wywołanie nie będzie blokować, ale dane wyjściowe mogą zawierać mniej entropii niż odpowiadający odczyt z / dev / random.

Jeśli więc nie zamierzasz generować CSPRNG (kryptograficznie bezpieczny generator liczb pseudolosowych), powinieneś użyć / dev / urandom.

Sachin Divekar
źródło
Czy /dev/randomnaprawdę wykorzystuje źródła takie jak hałas termiczny? Rozumiem, że wykorzystuje informacje ze (względnie) nieprzewidywalnego statusu systemu, takie jak aktywność we / wy i status procesu. Nie sądzę, że większość systemów Linux ma nawet sprzęt, który może zbierać szumy termiczne. Czy możesz przytoczyć dokumentację na ten temat?
Keith Thompson
tak masz rację. Informacje, o których wspomniałem, dotyczą generatora sprzętowego generatora liczb losowych.
Sachin Divekar
Spójrz na dokument, w jaki sposób jest on implementowany w systemie Linux w link . Wspomniano, że w środowisku PC LRNG zbiera entropię ze zdarzeń pochodzących z przerwań klawiatury, myszy, dysku i systemu. W innych środowiskach LRNG gromadzi entropię z dostępnych zasobów. Na przykład router OpenWRT nie zawiera dysku twardego, myszy i klawiatury, dlatego nie można ich używać jako źródeł entropii. Z drugiej strony router zbiera entropię ze zdarzeń sieciowych.
Sachin Divekar
Być może mógłbyś zaktualizować swoją odpowiedź. Nie sądzę, że można powiedzieć, że /dev/randomgeneruje „prawdziwie losowe liczby”.
Keith Thompson
Artykuł / dev / random na Wikipedii mówi, że Linux był pierwszym systemem operacyjnym, który zaimplementował w ten sposób prawdziwy generator liczb losowych w pierwszym akapicie.
Sachin Divekar
2

Bez odpowiedzi na twoje pytanie - są tu już pełne odpowiedzi - możesz również sprawdzić Darik's Boot i Nuke aka DBAN, który jest wycieraczką napędu na CD.

Randy Orrison
źródło
0

Wystarczy użyć shredpolecenia dostarczonego z coreutils. Efektywnie wykorzystuje losowe dane. dd jest narzędziem niskiego poziomu i prawdopodobnie jest to trochę za niski poziom do tego zadania. shredbędzie na przykład skutecznie pomijać niedozwolone części urządzenia.

pixelbeat
źródło