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:
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.
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.
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.