Provided by: manpages-pl_4.23.1-1_all bug

NAZWA

       random, urandom - urządzenia źródłowe liczb losowych jądra

SKŁADNIA

       #include <linux/random.h>

       int ioctl(fd, RNDżądanie, parametr);

OPIS

       Specjalne  urządzenia  znakowe  /dev/random  i /dev/urandom (obecne w Linuksie od wersji 1.3.30) stanowią
       interfejs do wbudowanego w jądro generatora liczb losowych. Plik /dev/random ma numer główny urządzenia 1
       i numer poboczny 8. Plik /dev/urandom ma numer główny urządzenia 1 i numer poboczny 9.

       Generator liczb losowych zbiera szum środowiskowy ze sterowników urządzeń i innych źródeł do puli losowej
       (puli entropii). Generator przechowuje również szacunkową liczbę bitów szumu w puli losowej. Z  puli  tej
       tworzone są liczby losowe.

       Linux  3.17  i  późniejsze  zapewnia  prostszy i bezpieczniejszy interfejs getrandom(2), który nie wymaga
       plików specjalnych; więcej informacji w podręczniku getrandom(2).

       Przy odczycie, urządzenie  /dev/urandom  zwraca  losowe  bajty,  wygenerowane  za  pomocą  pseudolosowego
       generatora  liczb,  który pozyskuje ziarno z puli entropii. Odczyt z tego urządzenia nie blokuje się (nie
       dochodzi do zjawiska CPU yield), ale przy pozyskiwaniu znaczących ilości danych  może  wystąpić  znaczące
       opóźnienie.

       Podczas  odczytu  we wczesnej fazie rozruchu, /dev/urandom może zwrócić dane jeszcze przed zainicjowaniem
       puli losowej. Zastosowanie getrandom(2) lub /dev/random nie będzie podatne na to niekorzystne zjawisko.

       Urządzenie /dev/random jest przestarzałym interfejsem, pochodzącym jeszcze z  czasów,  gdy  implementacja
       kryptograficznych  funkcji pierwotnych (ang. cryptographic primitives) użyta w implementacji /dev/urandom
       nie była uważana za zaufaną. Zwraca losowe bajty w miarę napływu świeżego szumu do puli losowej i blokuje
       się,  gdy  jest to konieczne. Urządzenie /dev/random jest odpowiednie do aplikacji wymagających losowości
       wysokiej jakości, które mogą sobie pozwolić na opóźnienia o nieznanej długości.

       Jeśli pula losowa jest pusta, odczyt z /dev/random będzie wstrzymany do czasu zebrania dodatkowego  szumu
       środowiskowego.  Od  Linuksa  5.6,  flaga  O_NONBLOCK  jest  ignorowana, jako że /dev/random nie jest już
       blokowane, z wyjątkiem wczesnej fazy rozruchu. We wcześniejszych wersjach, jeśli open(2) jest wywołane do
       /dev/random z flagą O_NONBLOCK, kolejne read(2) nie będzie blokowane, jeśli żądana liczba bajtów nie jest
       dostępna. W zamian zwracane są dostępne bajty. Jeśli nie ma dostępnych bajtów, read(2) zwróci -1, a errno
       ustawi się na EAGAIN.

       Flaga  O_NONBLOCK  nie ma znaczenia przy otwieraniu /dev/urandom. Podczas wywołania read(2) do urządzenia
       /dev/urandom, odczyt do 256 bajtów zwróci żądaną wielkość bajtów; nie można ich przerwać sygnałem. Odczyt
       przy  użyciu  bufora ponad ten limit może zwrócić mniejszą liczbę bajtów niż żądana lub nie powieść się z
       błędem EINTR, jeśli nastąpi przerwanie sygnałem.

       Od Linuksa 3.16, read(2) z /dev/urandom zwróci co najwyżej 32 MB. read(2) z /dev/random zwróci nie więcej
       niż 512 bajtów (340 bajtów przed Linuksem 2.6.12).

       Pisanie  do  /dev/random  lub /dev/urandom zaktualizuje pulę entropii za pomocą pisanych danych, lecz nie
       zwiększy poziomu entropii. Oznacza to, że będzie to miało wpływ na odczyt z obu plików, lecz  nie  uczyni
       odczytu z /dev/random szybszym.

   Użycie
       Urządzenie  /dev/random  jest  uważane  za  przestarzały  interfejs,  a  /dev/urandom  jest preferowany i
       wystarczający we wszystkich przypadkach, z wyjątkiem aplikacji wymagających losowości we  wczesnej  fazie
       rozruchu, które muszą korzystać z getrandom(2), blokującego się do czasu zainicjowania puli losowej.

       Jeśli  plik  puli  losowej  jest  przechowywany  pomiędzy  ponownymi uruchomieniami, zgodnie z poniższymi
       zaleceniami, wyjście jest kryptograficznie bezpieczne w stosunku do atakujących bez dostępu do  lokalnego
       roota,  zaraz  po  przeładowaniu  go  w sekwencji rozruchowej i odnosi się w całości do sieciowych kluczy
       szyfrujących sesji (wszystkie główne dystrybucje Linuksa zachowują plik puli losowej pomiędzy  rozruchami
       od  co  najmniej  2000  roku).  Ponieważ  odczyt z /dev/random może nie być płynny, użytkownicy będą go z
       reguły chcieli otworzyć w  trybie  nieblokującym  (lub  przeprowadzać  odczyt  z  czasem  oczekiwania)  i
       udostępniać jakiś typ powiadomienia dla użytkownika, jeśli oczekiwana losowość nie jest od razu dostępna.

   Konfiguracja
       Jeśli  w  systemie  nie ma plików /dev/random i /dev/urandom, można je utworzyć przy użyciu następujących
       poleceń:

           mknod -m 666 /dev/random c 1 8
           mknod -m 666 /dev/urandom c 1 9
           chown root:root /dev/random /dev/urandom

       Gdy Linux uruchamiany jest przy niewielkim udziale operatora, pula losowa może być w dość  przewidywalnym
       stanie.  Faktyczna  ilość szumu w puli losowej jest wówczas poniżej ilości szacowanej. Aby przeciwdziałać
       temu efektowi, pomocne jest zapamiętywanie informacji o puli losowej  pomiędzy  kolejnymi  uruchomieniami
       systemu. Aby działo się to automatycznie, należy dodać wiersze do stosownych skryptów startowych Linuksa:

           echo "Inicjowanie generatora liczb losowych..."
           random_seed=/var/run/random-seed
           # Przechowanie wartości losowej od jednego startu systemu
           # do kolejnego startu. Ładowanie oraz późniejsze zachowywanie
           # całej puli losowej.
           if [ -f $random_seed ]; then
               cat $random_seed >/dev/urandom
           else
               touch $random_seed
           fi
           chmod 600 $random_seed
           poolfile=/proc/sys/kernel/random/poolsize
           [ -r $poolfile ] && bits=$(cat $poolfile) || bits=4096
           bytes=$(expr $bits / 8)
           dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

       Trzeba  również  dodać  następujące wiersze do stosownego skryptu uruchamianego podczas zamykania systemu
       Linuksa:

           # Przechowanie losowych danych pomiędzy wyłączeniem a włączeniem
           # komputera. Zachowywanie puli losowej generatora.
           echo "Zachowywanie puli losowej..."
           random_seed=/var/run/random-seed
           touch $random_seed
           chmod 600 $random_seed
           poolfile=/proc/sys/kernel/random/poolsize
           [ -r $poolfile ] && bits=$(cat $poolfile) || bits=4096
           bytes=$(expr $bits / 8)
           dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

       W  powyższych  przykładach   zakładamy,   że   Linux   jest   w   wersji   2.6.0   lub   nowszej,   gdzie
       /proc/sys/kernel/random/poolsize zwraca rozmiar puli entropii w bitach (zob. niżej).

   Interfejsy /proc
       Pliki  w katalogu /proc/sys/kernel/random (obecnym od Linuksa 2.3.16) udostępniają dodatkowe informacje o
       urządzeniu /dev/random:

       entropy_avail
              Plik z prawami tylko do odczytu, dostarcza dostępną entropię,  w  bitach.  Będzie  to  wielkość  w
              zakresie od 0 do 4096.

       poolsize
              Plik zawiera rozmiar puli losowej. Format tego pliku zależy od wersji jądra:

              Linux 2.4:
                     Plik podaje rozmiar puli losowej w bajtach. Zazwyczaj - 512 (bajtów). Plik jest zapisywalny
                     i może być zmieniony na dowolną wartość, dla której dostępny jest algorytm. Obecnie możliwe
                     wartości to: 32, 64, 128, 256, 512, 1024 lub 2048.

              Linux 2.6 i późniejsze:
                     Plik jest dostępny tylko do odczytu i podaje rozmiar puli losowej w bitach. Zawiera wartość
                     4096.

       read_wakeup_threshold
              Plik zawiera liczbę bitów entropii wymaganej do obudzenia procesu, który zasnął w  oczekiwaniu  na
              entropię z urządzenia /dev/random. Domyślna wartość do 64.

       write_wakeup_threshold
              Plik  zawiera liczbę bitów entropii poniżej której zostanie uśpiony proces, który wykona select(2)
              lub poll(2), aby otworzyć do zapisu urządzenie /dev/random.  Wartości te mogą być zmienione  przez
              zapis do tych plików.

       uuid i boot_id
              Pliki  te  zawierają  losowe  łańcuchy  znaków,  takie  jak  6fd5a44b-35f4-4ad4-a9b9-6b9be13e1fe9.
              Pierwszy z tych plików jest generowany na nowo przy każdym odczycie, a drugi jest generowany tylko
              raz.

   Interfejs ioctl(2)
       Następujące  żądania  ioctl(2)  są  zdefiniowane  na  deskryptorach  plików połączonych z /dev/random lub
       /dev/urandom. Wszystkie przeprowadzone żądania wpływają na wejściową pulę  entropii  zarówno  /dev/random
       jak  i  /dev/urandom.  Możliwość  CAP_SYS_ADMIN  jest  wymagana  przez  wszystkie  żądania  za  wyjątkiem
       RNDGETENTCNT.

       RNDGETENTCNT
              Zbiera wartość entropii z puli wejściowej, zawartość będzie taka sama jak  pliku  entropy_avail  w
              katalogu proc. Wyniki zostaną przechowane w liczbie całkowitej wskazanej przez argument.

       RNDADDTOENTCNT
              Zwiększa lub zmniejsza wartość entropii z puli wejściowej o wartość wskazaną przez argument.

       RNDGETPOOL
              Usunięte w Linuksie 2.6.9

       RNDADDENTROPY
              Dodaje dodatkową entropię do puli wejściowej, zwiększając wartość entropii. Różni się to od zapisu
              do /dev/random lub /dev/urandom, które dodaje pewne dane, lecz  nie  zwiększa  wartości  entropii.
              Używana jest poniższa struktura:

                  struct rand_pool_info {
                      int    wartość_entropii;
                      int    wiel_buf;
                      __u32  buf[0];
                  };

              Wartość_entropii  to  wartość  dodawana  (lub  odejmowana)  od  wartości  losowej,  buf to bufor o
              wielkości wiel_buf dodawany do puli losowej.

       RNDZAPENTCNT
       RNDCLEARPOOL
              Zeruje wielkość entropii we  wszystkich  pulach  i  dodaje  do  nich  pewne  dane  systemowe  (np.
              rzeczywisty czas trwania - tzw. wall clock).

PLIKI

       /dev/random
       /dev/urandom

UWAGI

       Przegląd i porównanie różnych interfejsów do pozyskiwania losowości znajduje się w podręczniku random(7).

USTERKI

       Podczas wczesnej fazy rozruchu, /dev/urandom może zwrócić dane jeszcze przed zainicjowaniem puli losowej.

ZOBACZ TAKŻE

       mknod(1), getrandom(2), random(7)

       RFC 1750, „Randomness Recommendations for Security”

TŁUMACZENIE

       Autorami  polskiego  tłumaczenia  niniejszej  strony  podręcznika są: Paweł Olszewski <alder@amg.net.pl>,
       Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

       Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje  o  warunkach  licencji  można  uzyskać
       zapoznając  się  z  GNU General Public License w wersji 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ lub
       nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

       Błędy w tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy  dyskusyjnej  ⟨manpages-pl-
       list@lists.sourceforge.net⟩.