random(4) Device Drivers Manual random(4) NUME random, urandom - dispozitive sursa de numere aleatoare in nucleu REZUMAT #include int ioctl(fd, RNDrequest, param); DESCRIERE Fiierele de caractere speciale /dev/random i /dev/urandom (prezente incepand cu Linux 1.3.30) ofera o interfaa cu generatorul de numere aleatoare al nucleului. Fiierul /dev/random are numarul de dispozitiv major 1 i numarul de dispozitiv minor 8. Fiierul /dev/urandom are numarul de dispozitiv major 1 i numarul de dispozitiv minor 9. Generatorul de numere aleatoare aduna zgomotul din mediul inconjurator de la controlorii de dispozitiv i alte surse intr-un fond de entropie. Generatorul pastreaza, de asemenea, o estimare a numarului de bii de zgomot din fondul de entropie. Din acest fond de entropie sunt create numere aleatoare. Linux 3.17 i versiunile ulterioare ofera interfaa getrandom(2), mai simpla i mai sigura, care nu necesita fiiere speciale; consultai pagina de manual getrandom(2) pentru detalii. Atunci cand este citit, dispozitivul /dev/urandom returneaza octei aleatori folosind un generator de numere pseudo-aleatoare alimentat din fondul de entropie. Citirile de pe acest dispozitiv nu se blocheaza (adica nu se cedeaza procesorul), dar pot suferi o intarziere apreciabila atunci cand se solicita cantitai mari de date. Atunci cand este citit in timpul pornirii iniiale, /dev/urandom poate returna date inainte ca fondul de entropie sa fie iniializat. Daca acest lucru reprezinta un motiv de ingrijorare in aplicaia dumneavoastra, utilizai in schimb getrandom(2) sau /dev/random. Dispozitivul /dev/random este o interfaa motenita care dateaza dintr-o perioada in care primitivele criptografice utilizate in implementarea /dev/urandom nu erau de incredere pe scara larga. Acesta va returna octei aleatori numai in limita numarului estimat de bii de zgomot proaspat din fondul de entropie, blocandu-se daca este necesar. /dev/random este potrivit pentru aplicaiile care au nevoie de aleatorism de inalta calitate i care ii pot permite intarzieri nedeterminate. Atunci cand fondul de entropie este gol, citirile de pe /dev/random se vor bloca pana cand se aduna zgomotul ambiental suplimentar. Incepand cu Linux 5.6, indicatorul O_NONBLOCK este ignorat, deoarece /dev/random nu se va mai bloca decat in timpul procesului de pornire iniiala. In versiunile anterioare, daca open(2) este apelat pentru /dev/random cu indicatorul O_NONBLOCK, un read(2) ulterior nu se va bloca daca numarul de octei solicitat nu este disponibil. In schimb, sunt returnai octeii disponibili. Daca nu este disponibil niciun octet, read(2) va returna -1, iar errno va fi stabilita la EAGAIN. Fanionul O_NONBLOCK nu are niciun efect la deschiderea /dev/urandom. Atunci cand se apeleaza read(2) pentru dispozitivul /dev/urandom, citirile de pana la 256 de octei vor returna ataia octei cai sunt solicitai i nu vor fi intrerupte de un gestionar de semnal. Citirile cu o memorie tampon peste aceasta limita pot returna un numar de octei mai mic decat cel solicitat sau pot eua cu eroarea EINTR, daca sunt intrerupte de un gestionar de semnal. Incepand 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 octei (340 de octei inainte de Linux 2.6.12). Scrierea in /dev/random sau /dev/urandom va actualiza fondul de entropie cu datele scrise, dar acest lucru nu va duce la un numar mai mare de entropie. Acest lucru inseamna ca va avea un impact asupra coninutului citit din ambele fiiere, dar nu va face ca citirile din /dev/random sa fie mai rapide. Utilizare Interfaa /dev/random este considerata o interfaa motenita, iar /dev/urandom este preferata i suficienta in toate cazurile de utilizare, cu excepia aplicaiilor care necesita caracter aleatoriu in timpul pornirii iniiale; pentru aceste aplicaii, trebuie sa se utilizeze in schimb getrandom(2), deoarece se va bloca pana cand fondul de entropie este iniializat. In cazul in care un fiier de semine este salvat in timpul repornirii, aa cum se recomanda mai jos, fiierul de ieire este securizat criptografic impotriva atacatorilor fara acces root local, imediat ce este reincarcat in secvena de pornire i este perfect adecvat pentru cheile de sesiune de criptare a reelei; (toate distribuiile majore de Linux au salvat fiierul de semine in timpul repornirii cel puin din anul 2000). Deoarece citirile din /dev/random se pot bloca, utilizatorii vor dori, de obicei, sa il deschida in mod neblocat (sau sa efectueze o citire cu temporarizare) i sa ofere un fel de notificare utilizatorului daca entropia dorita nu este disponibila imediat. Configurare Daca sistemul dumneavoastra nu are deja create /dev/random i /dev/urandom, acestea pot fi create cu urmatoarele 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 cand un sistem Linux pornete fara prea multa interaciune cu operatorul, fondul de entropie poate fi intr-o stare destul de previzibila. Acest lucru reduce cantitatea reala de zgomot din fondul de entropie sub valoarea estimata. Pentru a contracara acest efect, este utila transmiterea informaiilor privind fondul de entropie pe parcursul opririlor i pornirilor. Pentru a face acest lucru, adaugai liniile la un script corespunzator care este executat in timpul secvenei de pornire a sistemului Linux: echo "Se iniializeaza generatorul de numere aleatorii..." random_seed=/var/run/random-seed # Transmite o samana aleatorie de la o pornire la alta # Incarca i apoi salveaza intregul 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, adaugai urmatoarele linii intr-un script corespunzator care se executa in timpul inchiderii sistemului Linux: # Transmite o samana aleatorie de la oprire la pornire # Salveaza intregul fond de entropie echo "Se salveaza seminele 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 In exemplele de mai sus, presupunem Linux 2.6.0 sau o versiune ulterioara, unde /proc/sys/kernel/random/poolsize returneaza dimensiunea fondului de entropie in bii (a se vedea mai jos). Interfee ,,/proc" Fiierele din directorul /proc/sys/kernel/random (prezent din Linux 2.3.16) ofera informaii suplimentare despre dispozitivul /dev/random: entropy_avail Acest fiier doar pentru citire ofera entropia disponibila, in bii. Acesta va fi un numar cuprins intre 0 i 4096. poolsize Acest fiier indica dimensiunea fondului de entropie. Semantica acestui fiier variaza in funcie de versiunile nucleului: Linux 2.4: Acest fiier indica dimensiunea fondului de entropie in octei. In mod normal, acest fiier va avea valoarea 512, dar poate fi inscripionat i poate fi modificat la orice valoare pentru care este disponibil un algoritm. Alegerile sunt 32, 64, 128, 256, 512, 1024 sau 2048. Linux 2.6 i versiunile ulterioare: Acest fiier este numai pentru citire i ofera dimensiunea fondului de entropie in bii. Acesta conine valoarea 4096. read_wakeup_threshold Acest fiier conine numarul de bii de entropie necesar pentru trezirea proceselor care ateapta entropie de la /dev/random. Valoarea implicita este de 64. write_wakeup_threshold Acest fiier conine numarul de bii de entropie sub care sunt trezite procesele care fac un select(2) sau poll(2) pentru acces in scris la /dev/random. Aceste valori pot fi modificate prin scrierea in fiiere. uuid and boot_id Aceste fiiere doar pentru citire conin iruri aleatorii precum 6fd5a44b-35f4-4ad4-a9b9-6b9be13e1fe9. Primul este generat din nou la fiecare citire, iar cel de-al doilea a fost generat o singura data. interfaa ioctl(2) Urmatoarele cereri ioctl(2) sunt definite in descriptorii de fiiere conectai fie la /dev/random, fie la /dev/urandom. Toate cererile efectuate vor interaciona cu fondul de entropie de intrare, avand un impact atat asupra /dev/random, cat i asupra /dev/urandom. Capacitatea CAP_SYS_ADMIN este necesara pentru toate cererile, cu excepia RNDGETENTCNT. RNDGETENTCNT Obine numarul de entropie al fondului de intrare; coninutul va fi acelai cu cel al fiierului entropy_avail din cadrul proc. Rezultatul va fi stocat in numarul intreg indicat de argument. RNDADDTOENTCNT Marete sau descrete numarul de entropie al fondului de intrare cu valoarea indicata de argument. RNDGETPOOL Eliminata in Linux 2.6.9. RNDADDENTROPY Adauga o cantitate suplimentara de entropie la fondul de intrare, crescand numarul de entropie. Acest lucru difera de scrierea in /dev/random sau /dev/urandom, care adauga doar cateva date, dar nu marete numarul de entropie. Se utilizeaza urmatoarea structura: struct rand_pool_info { int entropy_count; int buf_size; __u32 buf[0]; }; Aici entropy_count este valoarea adaugata la (sau scazuta din) numarul de entropie, iar buf este memoria tampon de dimensiunea buf_size care se adauga la fondul de entropie. RNDZAPENTCNT RNDCLEARPOOL Anuleaza numarul de entropie al tuturor unitailor i adauga unele date de sistem (cum ar fi timpul real) la aceste unitai. FIIERE /dev/random /dev/urandom NOTE Pentru o prezentare generala i o comparaie a diverselor interfee care pot fi utilizate pentru a obine caracterul aleatoriu, a se vedea random(7). ERORI In timpul pornirii iniiale, citirile din /dev/urandom pot returna date inainte ca fondul de entropie sa fie iniializat. CONSULTAI I mknod(1), getrandom(2), random(7) RFC 1750, "Randomness Recommendations for Security" TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.06 31 octombrie 2023 random(4)