Provided by: manpages-pl_0.6-2_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.  Generator  przechowuje  również  szacunkową  liczbę bitów szumu w puli
       losowej. Z puli tej tworzone są liczby losowe.

       W trakcie odczytu, urządzenie /dev/random zwraca losowe bajty, spośród oszacowanej  liczby
       bitów  szumu  w  puli. /dev/random nadaje się najlepiej do zastosowań, w których potrzebna
       jest losowość bardzo wysokiej jakości, jak np. jednorazowa maska lub  generowanie  kluczy.
       Jeśli  pula  losowa  jest  pusta, odczyt z /dev/random będzie wstrzymany do czasu zebrania
       dodatkowego szumu środowiskowego.

       Odczyt z urządzenia /dev/urandom zwróci tyle bajtów, ile zażądano. W efekcie, jeśli nie ma
       wystarczającego  chaosu w puli losowej, zwracane wartości są teoretycznie narażone na atak
       kryptograficzny w stosunku do algorytmów wykorzystywanych przez sterownik. Wiedza  na  ten
       temat nie jest dostępna w obecnych niezastrzeżonych publikacjach, ale istnieje teoretyczna
       możliwość przeprowadzenia takiego ataku. Jeśli  jest  to  problemem  w  przypadku  Twojego
       programu, użyj /dev/random.

       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
       Jeśli  nie jest pewne, czy należy użyć /dev/random, czy dev/urandom, to najprawdopodobniej
       powinno się użyć tego ostatniego. Generalna zasada jest taka, że /dev/urandom powinno  być
       używane do wszystkiego, z wyjątkiem długoterminowych kluczy GPG/SSL/SSH.

       Jeśli  plik  puli  losowej jest przechowywany pomiędzy ponownymi uruchomieniami, zgodnie z
       poniższymi zaleceniami (czynią to wszystkie główne dystrybucje Linuksa od co najmniej 2000
       roku),  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.  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.

       Generator liczb losowych jądra jest zaprojektowany do tworzenia niewielkiej ilości  ziarna
       (ang.   seed)   o  wysokiej  jakości,  do  użycia  z  kryptograficznym  generatorem  liczb
       pseudolosowych (ang. cryptographic pseudo-random number generator - CPRNG). Głównym  celem
       było  bezpieczeństwo,  nie  szybkość,  i  jest on kiepsko przystosowany do tworzenia dużej
       ilości  danych  losowych.  Użytkownicy  powinni  odczytywać  niewielkie  ilości  ziarna  z
       /dev/urandom  (i  /dev/random)  -  niepotrzebne  odczytywanie  dużych ilości danych z tych
       urządzeń będzie miało negatywny wpływ na innych użytkowników urządzeń.

       Ilość ziarna potrzebna do wygenerowania klucza  kryptograficznego  zależy  od  efektywnego
       rozmiaru  klucza.  Na  przykład,  3072-bitowy  klucz prywatny RSA lub Diffiego-Hellmana ma
       efektywny rozmiar klucza  128-bitów  (wymaga  około  2^128  operacji  do  złamania),  więc
       generator klucza potrzebuje jedynie 128 bitów (16 bajtów) ziarna z /dev/random.

       O ile niewielki margines bezpieczeństwa powyżej tego minimum jest zrozumiały, jako ochrona
       przed słabościami algorytmu CPRNG, nie istnieje aktualnie algorytm kryptograficzny  zdolny
       zapewnić  więcej  niż  256 bitów bezpieczeństwa, więc jeśli jakiś program odczytuje więcej
       niż 256 bitów (32 bajtów) z losowego ziarna jądra na pojedyncze wywołanie lub na  rozsądny
       interwał  ponownego  tworzenia  ziarna  (co  najmniej  minuta), to jest to oznaka, że jego
       kryptografia nie jest umiejętnie zaimplementowana.

   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 644 /dev/random c 1 8
           mknod -m 644 /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ć następujące 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 ] && bytes=`cat $poolfile` || bytes=512
           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 ] && bytes=`cat $poolfile` || bytes=512
           dd if=/dev/urandom of=$random_seed count=1 bs=$bytes

   Interfejs /proc
       Pliki  w  katalogu  /proc/sys/kernel/random  (obecnym  od  wersji  2.3.16)  są  dodatkowym
       interfejsem do urządzenia /dev/random.

       Plik  z  prawami  tylko do odczytu entropy_avail dostarcza dostępną pulę losową. Zazwyczaj
       będzie to 4096 (bitów), całość dostępnej puli.

       Plik poolsize 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:  Plik  jest  dostępny  tylko  do odczytu i podaje rozmiar puli losowej w
                          bitach. Zawiera wartość 4096.

       Plik read_wakeup_threshold zawiera liczbę bitów entropii potrzebnej do obudzenia  procesu,
       który   zasnął,  czekając  na  entropię  z  pliku  /dev/random.   Domyślnie  -  64.   Plik
       write_wakeup_threshold 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.

       Pliki tylko do odczytu  uuid  i  boot_id  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 entropii, buf  to
              bufor o wielkości wiel_buf dodawany do puli entropii.

       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

ZOBACZ TAKŻE

       mknod(1)
       RFC 1750, "Randomness Recommendations for Security"

O STRONIE

       Angielska wersja tej strony  pochodzi  z  wydania  3.71  projektu  Linux  man-pages.  Opis
       projektu,  informacje  dotyczące  zgłaszania błędów, oraz najnowszą wersję oryginału można
       znaleźć pod adresem http://www.kernel.org/doc/man-pages/.

TŁUMACZENIE

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

       Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów  na
       stronie   http://sourceforge.net/projects/manpages-pl/.   Jest   zgodne   z  wersją   3.71
       oryginału.