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
Tlumaczenie niniejszej strony podrecznika: 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.18 8 lutego 2026 r. random(7)