Czy powinienem użyć /dev/random
lub /dev/urandom
?
W jakich sytuacjach wolałbym jedną od drugiej?
Czy powinienem użyć /dev/random
lub /dev/urandom
?
W jakich sytuacjach wolałbym jedną od drugiej?
Odpowiedzi:
Użyj /dev/urandom
do najbardziej praktycznych celów.
Dłuższa odpowiedź zależy od smaku Uniksa, z którego korzystasz.
Historycznie, /dev/random
i /dev/urandom
oba zostały wprowadzone w tym samym czasie.
Jak zauważył @DavidSchwartz w komentarzu , użycie /dev/urandom
jest preferowane w zdecydowanej większości przypadków. On i inni podali również link do doskonałych mitów na temat/dev/urandom
artykułu, który polecam do dalszej lektury.
W podsumowaniu:
/dev/random
blokuje się, gdy skończy się entropia/dev/urandom
nigdy się nie zablokuje, odczytywanie /dev/random
może zatrzymać wykonywanie procesów./dev/urandom
może nie generować losowości wysokiej jakości./dev/urandom
nie wyczerpuje puli entropii (używanej przez /dev/random
), ale korzysta z danych wyjściowych CSPRNG z nadrzędnego./dev/urandom
.Wyjątki od reguły
W Cryptography Stos Exchange Kiedy używać /dev/random
ponad /dev/urandom
w Linux
@otus daje dwa przypadki użycia :
Krótko po uruchomieniu na urządzeniu o niskiej entropii, jeśli nie została jeszcze wygenerowana wystarczająca ilość entropii do prawidłowego uruchomienia /dev/urandom
.
Generowanie jednorazowej podkładki z teoretycznym bezpieczeństwem informacji
Jeśli martwisz się (1), możesz sprawdzić entropię dostępną w/dev/random
.
Jeśli robisz (2) to już wiesz :)
Uwaga: Możesz sprawdzić, czy odczyt z / dev / random zablokuje , ale uważaj na możliwe warunki wyścigu.
Alternatywnie: nie używaj ani!
@otus wskazał również, że getrandom()
system będzie czytał /dev/urandom
i blokował tylko wtedy, gdy początkowa entropia nasion jest niedostępna.
Występują problemy ze zmianą sposobu /dev/urandom
użytkowaniagetrandom()
, ale możliwe jest, że nowe /dev/xrandom
urządzenie zostanie utworzone na podstawie getrandom()
.
Nie ma znaczenia, jak mówi Wikipedia :
macOS wykorzystuje 160-bitowy Yarrow oparty na SHA1. Nie ma różnicy między / dev / random i / dev / urandom; oba zachowują się identycznie. Apple iOS używa również Yarrow.
Nie ma znaczenia, jak mówi Wikipedia :
/dev/urandom
jest tylko linkiem do/dev/random
bloków i tylko do prawidłowego zaszczepienia.
Oznacza to, że po uruchomieniu FreeBSD jest wystarczająco inteligentny, aby poczekać, aż zostanie zgromadzona wystarczająca entropia nasion, zanim dostarczy niekończący się strumień losowej dobroci.
Użyj /dev/urandom
, zakładając, że twój system przynajmniej raz przeczytał, /dev/random
aby zapewnić prawidłowe początkowe inicjowanie.
Strona rnd (4) mówi :
/dev/urandom
Nigdy nie blokuje.
/dev/random
Czasem bloki. Blokuje się wcześnie podczas rozruchu, jeśli wiadomo, że stan systemu jest przewidywalny.Aplikacje powinny czytać z / dev / urandom, gdy potrzebują losowo generowanych danych, np. Kluczy kryptograficznych lub zarodków do symulacji.
Systemy powinny być tak zaprojektowane, aby przynajmniej rozsądnie czytały z / dev / random podczas rozruchu przed uruchomieniem jakichkolwiek usług komunikujących się z Internetem lub w inny sposób wymagających kryptografii, aby uniknąć przewidywalnego generowania kluczy.
/dev/urandom
- z wyjątkiem tego, że /dev/urandom
na OpenBSD nie ma czegoś takiego jak . OpenBSD ma /dev/arandom
, ale nie powinieneś go używać, arc4random(3)
zamiast tego powinieneś użyć tej funkcji. Być może porady dotyczące losowych urządzeń i funkcji należy pozostawić osobom, które faktycznie rozumieją, o co w tym wszystkim chodzi?
/dev/random
blokuje się, gdy zabraknie entropii” - w systemie Linux zależy to od sposobu otwarcia urządzenia. Jeśli open
flagi zawierają, O_NONBLOCK
to nie będzie blokować. Jeśli nie ma entropii, wywołanie natychmiast powróci i wskaże 0 odczytanych bajtów.
/dev/random
jest tylko (np. :) 60 bajtów, dd
otrzymasz plik 60 bajtów. Używanie head
w tym samym scenariuszu prawdopodobnie będzie wyglądało na zawieszenie na zawsze. Nie robi też tego, co chcesz, ale przynajmniej dla mnie bardziej oczywiste head
jest, że nie robi się tego, czego się spodziewano.
Tradycyjnie jedyną różnicą pomiędzy /dev/urandom
i /dev/random
jest to, co dzieje się, gdy jądro myśli, że w systemie /dev/random
nie ma entropii - zawodzi zamknięte, /dev/urandom
zawodzi otwarte. Obaj kierowcy byli pozyskiwania od entropii add_disk_randomness()
, add_interrupt_randomness()
oraz add_input_randomness()
. Sprawdź /drivers/char/random.c
szczegóły.
Zmodyfikowano, aby dodać: Począwszy od Linuksa 4.8 /dev/urandom
został przerobiony na CSPRNG.
Więc kiedy powinieneś zawieść zamknięty? Do wszelkiego rodzaju zastosowań kryptograficznych, w szczególności do rozsiewania DRBG. Istnieje bardzo dobry artykuł wyjaśniający konsekwencje używania /dev/urandom
podczas generowania kluczy RSA i braku wystarczającej entropii. Przeczytaj Mining Your Ps and Qs .
Jest to poniekąd odpowiedź „ja też”, ale wzmacnia zalecenie Toma Hale'a. Dotyczy to tylko Linuksa.
/dev/urandom
/dev/random
Według Theodore Ts'o na liście mailingowej Linux Kernel Crypto /dev/random
jest przestarzały od dekady. Z Re: [RFC PATCH v12 3/4] Linux Generator liczb losowych :
Praktycznie nikt nie używa / dev / random. Jest to zasadniczo przestarzały interfejs; głównymi interfejsami, które były zalecane od ponad dekady, jest / dev / urandom, a teraz getrandom (2).
Regularnie testujemy /dev/random
i napotyka on często awarie. Test wykonuje trzy kroki: (1) drenaż /dev/random
, prosząc o 10 KB bajtów w trybie nieblokującym; (2) zażądaj 16 bajtów w trybie blokowania (3) spróbuj skompresować blok, aby sprawdzić, czy jest on losowy (test biedaka). Test trwa kilka minut.
Problem jest tak poważny w systemach Debain (i686, x86_64, ARM i MIPS), że poprosiliśmy GCC Compile Farm o zainstalowanie rng-tools
pakietu dla ich maszyn testowych. Z Instaluj narzędzia rng na gcc67 i gcc68 :
Chciałbym poprosić o zainstalowanie narzędzi rng na gcc67 i gcc68. Są to systemy Debian i / dev / random cierpi na wyczerpanie entropii bez narzędzi rng podczas bibliotek testujących tortury, które korzystają z tego urządzenia.
BSD i OS X wydają się OK. Problemem jest zdecydowanie Linux.
Warto również wspomnieć, że Linux nie rejestruje awarii generatora. Nie chcieli, aby wpisy wypełniały dziennik systemu. Do tej pory większość awarii jest cicha i pozostaje niezauważona przez większość użytkowników.
Sytuacja powinna się wkrótce zmienić, ponieważ jądro wydrukuje co najmniej jeden komunikat o błędzie. Z [PATCH] losowo: wycisz ostrzeżenia kompilatora i napraw wyścig na liście kryptograficznej jądra:
W szczególności dodałem
depends on DEBUG_KERNEL
. Oznacza to, że te przydatne ostrzeżenia będą atakować tylko innych programistów jądra. To jest prawdopodobnie dokładnie to, czego chcemy. Jeśli różni powiązani programiści zobaczą ostrzeżenie pochodzące z ich konkretnego podsystemu, będą bardziej zmotywowani do jego naprawy. Zwykli użytkownicy w jądrach dystrybucji w ogóle nie powinni widzieć ostrzeżeń ani spamu, ponieważ zazwyczaj użytkownicy nie używają DEBUG_KERNEL.Myślę, że złym pomysłem jest tłumienie wszystkich wiadomości z punktu widzenia inżynierii bezpieczeństwa.
Wielu ludzi nie uruchamia jądra debugowania. Większość użytkowników, którzy chcą lub muszą wiedzieć o problemie, nie zdają sobie sprawy z jego wystąpienia. Zastanów się, powodem, dla którego dowiedzieliśmy się o problemach systemd, był dmesg.
Pomijając wszystkie wiadomości dla wszystkich konfiguracji, rzucono szerszą sieć niż to konieczne. Konfiguracje, które potencjalnie mogą zostać wykryte i naprawione, prawdopodobnie pozostaną niezauważone. Jeśli problem nie zostanie ujawniony, nie zostanie rozwiązany.
Wydaje mi się, że jądro podejmuje decyzje polityczne dla niektórych organizacji. Dla tych, którzy mają sprzęt, którego nie da się naprawić, organizacja musi zdecydować, co zrobić na podstawie przeciwności ryzyka. Mogą zdecydować się na życie z ryzykiem lub mogą odświeżyć sprzęt. Jednak bez informacji na ten temat mogą nawet nie zdawać sobie sprawy, że mają przedmiot, który można wykonać.
Kompromis osiągnięty później w wątku wynosił co najmniej jeden dmesg na moduł wywołujący.