| random(4) | Device Drivers Manual | random(4) |
random, urandom - dispozitive sursă de numere aleatoare în nucleu
#include <linux/random.h>
int ioctl(fd, RNDrequest, param);
Fișierele de caractere speciale /dev/random și /dev/urandom (prezente începând cu Linux 1.3.30) oferă o interfață cu generatorul de numere aleatoare al nucleului. Fișierul /dev/random are numărul de dispozitiv major 1 și numărul de dispozitiv minor 8. Fișierul /dev/urandom are numărul de dispozitiv major 1 și numărul de dispozitiv minor 9.
Generatorul de numere aleatoare adună zgomotul din mediul înconjurător de la controlorii de dispozitiv și alte surse într-un fond de entropie. Generatorul păstrează, de asemenea, o estimare a numărului de biți de zgomot din fondul de entropie. Din acest fond de entropie sunt create numere aleatoare.
Linux 3.17 și versiunile ulterioare oferă interfața getrandom(2), mai simplă și mai sigură, care nu necesită fișiere speciale; consultați pagina de manual getrandom(2) pentru detalii.
Atunci când este citit, dispozitivul /dev/urandom returnează octeți aleatori folosind un generator de numere pseudo-aleatoare alimentat din fondul de entropie. Citirile de pe acest dispozitiv nu se blochează (adică nu se cedează procesorul), dar pot suferi o întârziere apreciabilă atunci când se solicită cantități mari de date.
Atunci când este citit în timpul pornirii inițiale, /dev/urandom poate returna date înainte ca fondul de entropie să fie inițializat. Dacă acest lucru reprezintă un motiv de îngrijorare în aplicația dumneavoastră, utilizați în schimb getrandom(2) sau /dev/random.
Dispozitivul /dev/random este o interfață moștenită care datează dintr-o perioadă în care primitivele criptografice utilizate în implementarea /dev/urandom nu erau de încredere pe scară largă. Acesta va returna octeți aleatori numai în limita numărului estimat de biți de zgomot proaspăt din fondul de entropie, blocându-se dacă este necesar. /dev/random este potrivit pentru aplicațiile care au nevoie de aleatorism de înaltă calitate și care își pot permite întârzieri nedeterminate.
Atunci când fondul de entropie este gol, citirile de pe /dev/random se vor bloca până când se adună zgomotul ambiental suplimentar. Începând cu Linux 5.6, indicatorul O_NONBLOCK este ignorat, deoarece /dev/random nu se va mai bloca decât în timpul procesului de pornire inițială. În versiunile anterioare, dacă open(2) este apelat pentru /dev/random cu indicatorul O_NONBLOCK, un read(2) ulterior nu se va bloca dacă numărul de octeți solicitat nu este disponibil. În schimb, sunt returnați octeții disponibili. Dacă nu este disponibil niciun octet, read(2) va returna -1, iar errno va fi stabilită la EAGAIN.
Fanionul O_NONBLOCK nu are niciun efect la deschiderea /dev/urandom. Atunci când se apelează read(2) pentru dispozitivul /dev/urandom, citirile de până la 256 de octeți vor returna atâția octeți câți sunt solicitați și nu vor fi întrerupte de un gestionar de semnal. Citirile cu o memorie tampon peste această limită pot returna un număr de octeți mai mic decât cel solicitat sau pot eșua cu eroarea EINTR, dacă sunt întrerupte de un gestionar de semnal.
Începând cu Linux 3.16, un read(2) din /dev/urandom va returna cel mult 32 Mo. Un read(2) de la /dev/random va returna cel mult 512 octeți (340 de octeți înainte de Linux 2.6.12).
Scrierea în /dev/random sau /dev/urandom va actualiza fondul de entropie cu datele scrise, dar acest lucru nu va duce la un număr mai mare de entropie. Acest lucru înseamnă că va avea un impact asupra conținutului citit din ambele fișiere, dar nu va face ca citirile din /dev/random să fie mai rapide.
Interfața /dev/random este considerată o interfață moștenită, iar /dev/urandom este preferată și suficientă în toate cazurile de utilizare, cu excepția aplicațiilor care necesită caracter aleatoriu în timpul pornirii inițiale; pentru aceste aplicații, trebuie să se utilizeze în schimb getrandom(2), deoarece se va bloca până când fondul de entropie este inițializat.
În cazul în care un fișier de semințe este salvat în timpul repornirii, așa cum se recomandă mai jos, fișierul de ieșire este securizat criptografic împotriva atacatorilor fără acces root local, imediat ce este reîncărcat în secvența de pornire și este perfect adecvat pentru cheile de sesiune de criptare a rețelei; (toate distribuțiile majore de Linux au salvat fișierul de semințe în timpul repornirii cel puțin din anul 2000). Deoarece citirile din /dev/random se pot bloca, utilizatorii vor dori, de obicei, să îl deschidă în mod neblocat (sau să efectueze o citire cu temporarizare) și să ofere un fel de notificare utilizatorului dacă entropia dorită nu este disponibilă imediat.
Dacă sistemul dumneavoastră nu are deja create /dev/random și /dev/urandom, acestea pot fi create cu următoarele comenzi:
mknod -m 666 /dev/random c 1 8 mknod -m 666 /dev/urandom c 1 9 chown root:root /dev/random /dev/urandom
Atunci când un sistem Linux pornește fără prea multă interacțiune cu operatorul, fondul de entropie poate fi într-o stare destul de previzibilă. Acest lucru reduce cantitatea reală de zgomot din fondul de entropie sub valoarea estimată. Pentru a contracara acest efect, este utilă transmiterea informațiilor privind fondul de entropie pe parcursul opririlor și pornirilor. Pentru a face acest lucru, adăugați liniile la un script corespunzător care este executat în timpul secvenței de pornire a sistemului Linux:
echo "Se inițializează generatorul de numere aleatorii..." random_seed=/var/run/random-seed # Transmite o sămânță aleatorie de la o pornire la alta # Încarcă și apoi salvează întregul fond entropic 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
De asemenea, adăugați următoarele linii într-un script corespunzător care se execută în timpul închiderii sistemului Linux:
# Transmite o sămânță aleatorie de la oprire la pornire # Salvează întregul fond de entropie echo "Se salvează semințele aleatorii..." 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
În exemplele de mai sus, presupunem Linux 2.6.0 sau o versiune ulterioară, unde /proc/sys/kernel/random/poolsize returnează dimensiunea fondului de entropie în biți (a se vedea mai jos).
Fișierele din directorul /proc/sys/kernel/random (prezent din Linux 2.3.16) oferă informații suplimentare despre dispozitivul /dev/random:
Următoarele cereri ioctl(2) sunt definite în descriptorii de fișiere conectați fie la /dev/random, fie la /dev/urandom. Toate cererile efectuate vor interacționa cu fondul de entropie de intrare, având un impact atât asupra /dev/random, cât și asupra /dev/urandom. Capacitatea CAP_SYS_ADMIN este necesară pentru toate cererile, cu excepția RNDGETENTCNT.
struct rand_pool_info {
int entropy_count;
int buf_size;
__u32 buf[0];
};
/dev/random
/dev/urandom
Pentru o prezentare generală și o comparație a diverselor interfețe care pot fi utilizate pentru a obține caracterul aleatoriu, a se vedea random(7).
În timpul pornirii inițiale, citirile din /dev/urandom pot returna date înainte ca fondul de entropie să fie inițializat.
mknod(1), getrandom(2), random(7)
RFC 1750, "Randomness Recommendations for Security"
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>
Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.
Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.
| 2 mai 2024 | Pagini de manual de Linux 6.9.1 |