random(4)

NUME
random, urandom - dispozitive sursă de numere aleatoare în nucleu

SINOPSIS
#include <linux/random.h>

int ioctl(fd, RNDrequest, param);

DESCRIERE
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.

  Utilizare
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.

  Configurare
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).

  Interfețe „/proc”
Fișierele din directorul /proc/sys/kernel/random (prezent din Linux 2.3.16) oferă informații suplimentare despre dispozitivul /dev/random:

entropy_avail
    Acest fișier doar pentru citire oferă entropia disponibilă, în biți. Acesta va fi un număr cuprins între 0 și 4096.

poolsize
    Acest fișier indică dimensiunea fondului de entropie. Semantica acestui fișier variază în funcție de versiunile nucleului:

    Linux 2.4:
        Acest fișier indică dimensiunea fondului de entropie în octeți. În mod normal, acest fișier va avea valoarea 512, dar poate fi inscripționat ș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 fișier este numai pentru citire și oferă dimensiunea fondului de entropie în biți. Acesta conține valoarea 4096.

read_wakeup_threshold
    Acest fișier conține numărul de biți de entropie necesar pentru trezirea proceselor care așteaptă entropie de la /dev/random. Valoarea implicită este de 64.

write_wakeup_threshold
    Acest fișier conține numărul de biți de entropie sub care sunt trezite procesele care fac un select(2) sau poll(2) pentru acces în scris la /dev/random. Aceste valori pot fi modificate prin scrierea în fișiere.

uuid
boot_id
    Aceste fișiere doar pentru citire conțin ș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 singură dată.

  interfața ioctl(2)
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.

RNDGETENTCNT
    Obține numărul de entropie al fondului de intrare; conținutul va fi același cu cel al fișierului entropy_avail din cadrul proc. Rezultatul va fi stocat în numărul întreg indicat de argument.

RNDADDTOENTCNT
    Mărește sau descrește numărul de entropie al fondului de intrare cu valoarea indicată de argument.

RNDGETPOOL
    Eliminată în Linux 2.6.9.

RNDADDENTROPY
    Adaugă o cantitate suplimentară de entropie la fondul de intrare, crescând numărul de entropie. Acest lucru diferă de scrierea în /dev/random sau /dev/urandom, care adaugă doar câteva date, dar nu mărește numărul de entropie. Se utilizează următoarea structură:

        struct rand_pool_info {
            int    entropy_count;
            int    buf_size;
            __u32  buf[0];
        };

    Aici entropy_count este valoarea adăugată la (sau scăzută din) numărul de entropie, iar buf este memoria tampon de dimensiunea buf_size care se adaugă la fondul de entropie.

RNDZAPENTCNT
RNDCLEARPOOL
    Anulează numărul de entropie al tuturor unităților și adaugă unele date de sistem (cum ar fi timpul real) la aceste unități.

FIȘIERE
/dev/random
/dev/urandom

NOTE
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).

ERORI
În timpul pornirii inițiale, citirile din /dev/urandom pot returna date înainte ca fondul de entropie să fie inițializat.

CONSULTAȚI ȘI
mknod(1), getrandom(2), random(7)

RFC 1750, "Randomness Recommendations for Security"

TRADUCERE
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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.