Zarówno /dev/random
i /dev/urandom
użyć „entropii basen”. Kiedy pula się wyczerpie, /dev/random
czeka na jej uzupełnienie, co wymaga monitorowania zachowania systemu (wprowadzania danych z klawiatury, ruchu myszy itp.), Podczas gdy /dev/urandom
nadal będzie dostarczać pseudolosowe dane. /dev/random
jest teoretycznie wyższej jakości, ale /dev/urandom
prawie na pewno jest wystarczająco dobry do twoich celów. (Ale nawet /dev/urandom
prawdopodobnie 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/random
lub
/dev/urandom
, prawdopodobnie prawdopodobnie chcesz użyć tego drugiego. Zasadniczo /dev/urandom
powinna 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/random
Interfejs jest uważany za interfejs dziedzictwo i
/dev/urandom
jest 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/urandom
nawet 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/random
implementuje „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/random
zwykle 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/random
i /dev/urandom
któ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/random
wygenerowanie 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.