CRYPT(3)

NUME
crypt, crypt_r, crypt_rn, crypt_ra - criptarea (tăierea și amestecarea părților) frazei de acces

BIBLIOTECA
libcrypt

SINOPSIS
<crypt.h> char * crypt(const char *phrase, const char *setting) char * crypt_r(const char *phrase, const char *setting, struct crypt_data *data) char * crypt_rn(const char *phrase, const char *setting, struct crypt_data *data, int size) char * crypt_ra(const char *phrase, const char *setting, void **data, int *size)

DESCRIERE
Funcțiile crypt, crypt_r, crypt_rn și crypt_ra aplică în mod ireversibil “hash” (tăierea și amestecarea părților) la frază pentru stocarea în baza de date a parolelor sistemului (shadow(5)) utilizând o metodă criptografică “hashing” (tăierea și amestecarea părților). Rezultatul acestei operații se numește “hashed passphrase” (tăierea și amestecarea părților frazei de acces) sau pur și simplu “hash.” Metodele de „hash” sunt descrise în crypt(5).

Parametrii setting controlează metoda de „hash” utilizată și furnizează, de asemenea, diverși parametri pentru metoda aleasă, cel mai important fiind un „salt (un praf de sare)” aleatoriu “” care asigură că nu există două „hash-uri” stocate identice, chiar dacă șirurile fraza sunt identice.

Argumentul data pentru crypt_r este o structură de tip „struct crypt_data”. Aceasta are cel puțin următoarele câmpuri:

    struct crypt_data {
        char output[CRYPT_OUTPUT_SIZE];
        char setting[CRYPT_OUTPUT_SIZE];
        char input[CRYPT_MAX_PASSPHRASE_SIZE];
        char initialized;
    };

După o returnare cu succes din crypt_r, fraza de acces hash va fi stocată în output. Aplicațiile sunt încurajate, dar nu obligate, să utilizeze câmpurile input și setting pentru a stoca șirurile de caractere pe care le vor transmite ca input phrase și setting către crypt_r. Acest lucru va facilita ștergerea tuturor datelor sensibile după ce acestea nu mai sunt necesare.

Câmpul initialized trebuie să fie pus la zero înainte de prima utilizare a unui obiect „struct crypt_data” într-un apel către crypt_r(). Recomandăm să puneți la zero întregul obiect, nu doar initialized și nu doar câmpurile documentate, înainte de prima utilizare. (Desigur, faceți acest lucru înainte de a stoca orice în setting și input.)

Argumentul data pentru crypt_rn trebuie să indice, de asemenea, un obiect „struct crypt_data”, iar size trebuie să fie dimensiunea acelui obiect, convertită în int. Când este utilizat cu crypt_rn, întregul obiect data (cu excepția câmpurilor input și setting) trebuie să fie pus la zero înainte de prima utilizare; aceasta nu este doar o recomandare, așa cum este în cazul crypt_r. În rest, câmpurile obiectului au aceleași utilizări ca și în cazul crypt_r.

La prima apelare a crypt_ra, data trebuie să fie adresa unei variabile „void *” definită la NULL, iar size trebuie să fie adresa unei variabile int definită la zero. crypt_ra va aloca și inițializa un obiect „struct crypt_data”, utilizând malloc(3), și va scrie adresa și dimensiunea acestuia în variabilele indicate de data și size. Acestea pot fi reutilizate în apelurile ulterioare. După ce aplicația a terminat „hash-uirea” (tăierea și amestecarea părților) frazelor de acces, ar trebui să realoce obiectul „struct crypt_data” folosind free(3).

VALORI RETURNATE
După finalizarea cu succes, crypt, crypt_r, crypt_rn și crypt_ra returnează un indicator către un șir care codifică atât fraza de acces „hash-uită”, cât și parametrii utilizați pentru codificarea acesteia. Acest șir poate fi utilizat direct ca setting în alte apeluri către crypt, crypt_r, crypt_rn și crypt_ra și ca prefix în apeluri către crypt_gensalt, crypt_gensalt_rn și crypt_gensalt_ra. Va fi în întregime imprimabil ASCII și nu va conține spații albe sau caracterele ‘’:, ‘’;, ‘*’, ‘’! sau ‘\’. Consultați crypt(5) pentru mai multe detalii despre formatul frazelor de acces „hash-uite”.

crypt plasează rezultatul într-o zonă de stocare statică, care va fi suprascrisă de apelurile ulterioare către crypt. Nu este sigur să apelați crypt din mai multe fire de execuție simultan. De asemenea, nu este recomandat să utilizați indicatorul returnat ca argument pentru o altă apelare a crypt, deoarece unele implementări, inclusiv versiunile anterioare ale libxcrypt, pot suprascrie tamponul de ieșire static subiacent înainte de calcularea hash-ului.

crypt_r, crypt_rn și crypt_ra plasează rezultatul în câmpul output al argumentului data. Este sigur să le apelați simultan din mai multe fire, atâta timp cât se utilizează un obiect data separat pentru fiecare fir. De asemenea, nu este recomandat să utilizați indicatorul returnat ca argument pentru o altă apelare a crypt_r, crypt_rn și crypt_ra utilizând același obiect data pentru apelări ulterioare, deoarece unele implementări, inclusiv versiunile anterioare ale libxcrypt, pot suprascrie câmpul output al argumentului data transmis înainte de calcularea hash-ului. Nu se recomandă apelarea crypt_ra cu parametrii phrase și/sau setting aflați într-un obiect data transmis care este mai mic decât dimensiunea „struct crypt_data”, deoarece unele implementări, inclusiv versiunile anterioare ale libxcrypt, pot să nu păstreze literalele transmise, dacă obiectul data trebuie modificat.

În cazul unei erori, crypt_r, crypt_rn și crypt_ra scriu un hash nevalid în câmpul output al argumentului lor data, iar crypt scrie un hash nevalid în zona sa de stocare statică. Acest șir va avea mai puțin de 13 caractere, va începe cu ‘*’ și nu va fi egal cu setting.

În cazul unei erori, crypt_rn și crypt_ra returnează un indicator nul. crypt_r și crypt pot returna, de asemenea, un indicator nul sau pot returna un indicator către hash-ul nevalid, în funcție de modul în care a fost configurată libcrypt; (opțiunea de a returna hash-ul nevalid este pentru compatibilitate cu aplicațiile vechi care presupun că crypt nu poate returna un indicator nul. A se vedea secțiunea NOTE PRIVIND PORTABILITATEA de mai jos.)

Toate cele patru funcții definesc errno atunci când eșuează. Când funcțiile reușesc, valoarea errno este nespecificată și nu trebuie luată în considerare.

ERORI-IEȘIRE

EINVAL
    setting este nevalid sau solicită o metodă de hash care nu este acceptată.

ERANGE
    phrase este prea lungă (mai mult de CRYPT_MAX_PASSPHRASE_SIZE caractere; unele metode de hash pot avea limite mai mici).
    Numai crypt_rn: parametrul size este prea mic pentru metoda de hash solicitată de setting.

ENOMEM
    Nu s-a putut aloca memoria internă temporară.
    Numai crypt_ra: nu s-a putut aloca memorie pentru data.

ENOSYS sau EOPNOTSUPP
    Hash-ul parolelor nu este deloc acceptat în această instalare sau metoda de hash solicitată de setting nu este acceptată. Aceste coduri de eroare nu sunt utilizate de această versiune a libcrypt, dar pot apărea în alte sisteme.

NOTE PRIVIND PORTABILITATEA
crypt este inclus în POSIX, dar crypt_r, crypt_rn și crypt_ra nu fac parte din niciun standard.

POSIX nu specifică nicio metodă de hash și nu impune ca parolele hash să fie portabile între sisteme. În practică, parolele hash sunt portabile atâta timp cât ambele sisteme acceptă metoda de hash utilizată. Cu toate acestea, setul de metode de hash acceptate variază considerabil de la un sistem la altul.

Comportamentul crypt în cazul erorilor nu este bine standardizat. Unele implementări pur și simplu nu pot eșua (cu excepția blocării programului), altele returnează un indicator nul sau un șir fix. Majoritatea implementărilor nu definesc errno, dar unele o fac. POSIX specifică returnarea unui indicator nul și definirea errno, dar definește o singură eroare posibilă, ENOSYS, în cazul în care crypt nu este deloc acceptat. Unele aplicații mai vechi nu sunt pregătite să gestioneze indicatorii nul returnați de crypt. Comportamentul descris mai sus pentru această implementare, stabilirea errno și returnarea unui hash nevalid diferit de setting, este ales pentru a face ca aceste aplicații să eșueze prin terminarea operației atunci când apare o eroare.

Datorită restricțiilor istorice privind exportul de software criptografic din SUA, crypt este o componentă POSIX opțională. Aplicațiile trebuie să fie pregătite pentru eventualitatea ca crypt să nu fie disponibilă sau să eșueze întotdeauna ( stabilind errno la ENOSYS) în timpul rulării.

POSIX specifică faptul că crypt este declarat în <unistd.h>, dar numai dacă macrocomanda _XOPEN_CRYPT este definită și are o valoare mai mare sau egală cu zero. Deoarece libcrypt nu furnizează <unistd.h>, aceasta declară crypt, crypt_r, crypt_rn și crypt_ra în <crypt.h> .

Pe o minoritate de sisteme (în special versiunile recente ale Solaris), crypt utilizează un tampon de stocare static specific firelor de execuție, ceea ce face ca apelarea simultană din mai multe fire de execuție să fie sigură, dar nu împiedică fiecare apel dintr-un fir de execuție să suprascrie rezultatele celui anterior.

ERORI
Unele implementări ale crypt, în cazul unei erori, returnează un hash nevalid care este stocat într-o locație numai pentru citire sau inițializat o singură dată, ceea ce înseamnă că este sigur să ștergeți tamponul indicat de valoarea returnată de crypt numai dacă nu a apărut o eroare.

„struct crypt_data” poate fi destul de mare (32 ko în această implementare a libcrypt; peste 128 ko în alte implementări). Este suficient de mare încât ar putea fi neînțelept să o alocați pe stivă.

Unele metode de hash proiectate recent necesită și mai multă memorie temporară, dar interfața crypt_r face imposibilă modificarea dimensiunii „struct crypt_data” fără a afecta compatibilitatea binară. Interfața crypt_rn ar putea acomoda alocări mai mari pentru metode specifice de hash, dar apelantul crypt_rn nu are cum să știe câtă memorie să aloce. crypt_ra efectuează alocarea, dar poate efectua o singură apelare către malloc(3).

ATRIBUTE
Pentru o explicație a termenilor folosiți în această secțiune, a se vedea attributes(7).
Interfață | Atribut | Valoare
 | Siguranța firelor | MT-Unsafe race:crypt
 | Siguranța firelor | MT-Safe

ISTORIC
O funcție crypt bazată pe un rotor a apărut în AT&T UNIX. Funcția crypt “tradițională” bazată pe DES a apărut pentru prima dată în AT&T UNIX.

crypt_r provine din biblioteca GNU C. Există, de asemenea, o funcție crypt_r în HP-UX și MKS Toolkit, dar prototipurile și semantica diferă.

crypt_rn și crypt_ra provin din proiectul Openwall.

CONSULTAȚI ȘI
crypt_gensalt(3), getpass(3), getpwent(3), shadow(3), login(1), passwd(1), crypt(5), passwd(5), shadow(5), pam(8)

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.