random(7) Miscellaneous Information Manual random(7) NAZWA random - przeglad interfejsow do pozyskiwania losowosci OPIS Generator liczb losowych jadra generuje ziarno dla kryptograficznie bezpiecznego generatora liczb pseudolosowych (ang. cryptographically secure pseudorandom number generator -- CSPRNG), w oparciu o entropie zebrana ze sterownikow urzadzen i innych zrodel szumu srodowiskowego. Jest on zaprojektowany nie pod katem szybkosci, lecz bezpieczenstwa. Dostep do wyjscia z CSPRNG jadra daja nastepujace interfejsy: o Urzadzenia /dev/urandom i /dev/random, opisane w podreczniku random(4). Urzadzenia te istnialy od wczesnego Linuksa i sa dostepne rowniez na wielu innych systemach. o Typowo linuksowe wywolanie systemowe getrandom(2), dostepne od Linuksa 3.17. To wywolanie systemowe zapewnia dostep do tego samego zrodla co /dev/urandom (dalej: ,,zrodlo urandom") albo do tego samego zrodla co /dev/random (dalej: ,,zrodlo random"). Domyslnym zrodlem jest zrodlo urandom; zrodlo random jest wybierane podajac do wywolania systemowego znacznik GRND_RANDOM (funkcja getentropy(3) zapewnia nieco bardziej przenosny interfejs zbudowany na getrandom(2)). Inicjowanie puli entropii Jadro zbiera bity entropii ze srodowiska. Gdy zbierze odpowiednia ilosc losowych bitow, pula entropii jest uwazana za zainicjowana. Wybor zrodla losowosci O ile nie generuje sie dlugoterminowych kluczy (a zwykle nawet wowczas), prawdopodobnie nie ma potrzeby odczytywania z urzadzenia /dev/random, ani korzystania z getrandom(2) ze znacznikiem GRND_RANDOM. W zamian powinno sie odczytywac z urzadzenia /dev/urandom lub korzystac z getrandom(2) bez znacznika GRND_RANDOM. Algorytmy kryptograficzne uzywane jako zrodlo urandom sa dosc konserwatywne, dlatego powinny byc wystarczajace do wszystkich zastosowan. Wada GRND_RANDOM i odczytywania z /dev/random jest fakt, ze operacja ta moze blokowac na nieokreslony czas. Co wiecej, radzenie sobie z czesciowo zaspokojonymi zadaniami, co moze zdarzyc sie przy korzystaniu z GRND_RANDOM lub odczytywaniu z /dev/random, zwieksza zlozonosc kodu. Monte Carlo i inne zastosowania probkowania probabilistycznego Korzystanie z tych interfejsow w celu dostarczania duzej ilosci danych symulacjom Monte Carlo i innym programom/algorytmom wykonujacym probkowanie probabilistyczne bedzie wolne. Ponadto jest niezasadne, poniewaz takie aplikacje nie wymagaja liczb losowych kryptograficznie bezpiecznych. Zamiast tego, nalezy korzystac z opisanych w niniejszym podreczniku interfejsow do pozyskania niewielkiej ilosci danych jako ziarna do generatora liczb pseudolosowych, znajdujacego sie w przestrzeni uzytkownika, uzywanego przez aplikacje tego typu. Porownanie pomiedzy getrandom, /dev/urandom i /dev/random Ponizsza tabela podsumowuje zachowanie roznych interfejsow, jakie moga byc stosowane do pozyskania losowosci. GRND_NONBLOCK jest znacznikiem kontrolujacym blokujace zachowanie getrandom(2). Ostatnia kolumna dotyczy przypadku, jaki moze miec miejsce we wczesnej fazie rozruchu, gdy pula entropii nie zostala jeszcze zainicjowana. +--------------+------------------+------------------+--------------------+ |Interfejs | Pula | Zachowanie | Zachowanie, gdy | | | | blokowania | pula nie jest | | | | | jeszcze gotowa | +--------------+------------------+------------------+--------------------+ |/dev/random | Pula blokujaca | Gdy zbyt malo | Blokuje, do | | | | entropii, | momentu zebrania | | | | blokuje do | wystarczajacej | | | | momentu | entropii | | | | wystapienia | | | | | wystarczajacej | | | | | entropii | | +--------------+------------------+------------------+--------------------+ |/dev/urandom | Wyjscie CSPRNG | Nigdy nie | Zwraca wyjscie z | | | | blokuje | niezainicjowanej | | | | | CSPRNG (byc moze | | | | | ze zbyt niska | | | | | entropia, | | | | | nieodpowiednia dla | | | | | kryptografii) | +--------------+------------------+------------------+--------------------+ |getrandom() | Jak /dev/urandom | Nie blokuje po | Blokuje, do | | | | uzyskaniu | momentu uzyskania | | | | gotowosci puli | gotowosci puli | +--------------+------------------+------------------+--------------------+ |getrandom() | Jak /dev/random | Gdy zbyt malo | Blokuje, do | |GRND_RANDOM | | entropii, | momentu uzyskania | | | | blokuje do | gotowosci puli | | | | momentu | | | | | wystapienia | | | | | wystarczajacej | | | | | entropii | | +--------------+------------------+------------------+--------------------+ |getrandom() | Jak /dev/urandom | Nie blokuje po | EAGAIN | |GRND_NONBLOCK | | uzyskaniu | | | | | gotowosci puli | | +--------------+------------------+------------------+--------------------+ |getrandom() | Jak /dev/random | EAGAIN gdy zbyt | EAGAIN | |GRND_RANDOM + | | malo entropii | | |GRND_NONBLOCK | | | | +--------------+------------------+------------------+--------------------+ Generowanie kluczy kryptograficznych Ilosc ziarna, potrzebnego do wygenerowania klucza kryptograficznego rowna sie efektywnemu rozmiarowi klucza. Przykladowo, 3072-bitowy klucz prywatny RSA lub Diffiego-Hellmana ma efektywny rozmiar 128 bitow (wymaga okolo 2^128 operacji do zlamania), zatem generator klucza potrzebuje jedynie 128 bitow (16 bajtow) ziarna z /dev/random. Choc pewien margines bezpieczenstwa ponad to minimum jest rozsadny, jako zabezpieczenie wobec ulomnosci w algorytmie CSPRNG, zadna z dostepnych aktualnie funkcji pierwotnych nie moze obiecac wiecej niz 256 bitow bezpieczenstwa, zatem jesli program odczytuje wiecej niz 256 bitow (32 bajty) z puli losowosci jadra na wywolanie albo na rozsadny interwal ponownego generowania ziarna (nie mniejszy niz minute), nalezy to uznac za oznake braku umiejetnej implementacji kryptograficznej. ZOBACZ TAKZE getrandom(2), getauxval(3), getentropy(3), random(4), urandom(4), signal(7) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.9.1 2 maja 2024 r. random(7)