Sare (criptografie)

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 15 octombrie 2019; verificările necesită 17 modificări .

Salt (de asemenea, un modificator de intrare al funcției hash ) este un șir de date care este transmis funcției hash împreună cu matricea de date de intrare ( preimage ) pentru a calcula hash-ul ( imagine ).

Folosit pentru a face mai dificilă determinarea preimaginei unei funcții hash prin iterarea unui dicționar de posibile valori de intrare (preimagini), inclusiv atacuri folosind tabele curcubeu . Vă permite să ascundeți faptul că utilizați aceleași prototipuri atunci când folosiți săruri diferite pentru ele. Există sare statică (aceeași pentru toate valorile de intrare) și sare dinamică (generată pentru fiecare valoare de intrare individual).

Exemplu de utilizare

Lăsați parolele să fie hash folosind algoritmul MD5 și stocate ca valori hash în baza de date . În cazul furtului unei baze de date, parolele originale pot fi recuperate folosind tabele curcubeu pregătite în prealabil , deoarece utilizatorii folosesc adesea parole nesigure care sunt ușor de selectat din dicționare [1] . Dacă parola este „sărată”, adică atunci când se calculează valorile hash, adăugați la datele de intrare un șir de mai multe caractere aleatoare care va fi valoarea de sare, atunci valorile rezultate nu se vor potrivi cu dicționarele comune de valori hash. Cunoașterea sării vă permite să generați noi dicționare pe care să le repetați, astfel încât valoarea sării trebuie păstrată secretă. Pentru sare, se aplică aceleași recomandări pentru complexitate ca și pentru complexitatea parolei, adică valoarea sării ar trebui să aibă entropie și lungime bune [2] .

Un exemplu de creare a unui hash folosind o sare statică în PHP pe baza principiului concatenării (conexiunii) cu datele de intrare:

$parola1 = '12345' ; $ parola2 = '67890' ; $salt = 'sflpr9fhi2' ; // Salt $ parola1_sareHash = md5 ( $parola1 . $sare ); // Concatenează șirul de intrare cu sare și trece-l prin funcția hash md5() $ parola2_saltedHash = md5 ( $parola2 . $sare );

În acest exemplu, sarea este un șir determinist , ceea ce înseamnă că valoarea sării este constantă pentru toate intrările.

Sarea dinamică

Există scheme dinamice de formare a sării, în care valorile de sare sunt generate individual pentru fiecare valoare de intrare, ceea ce face dificilă compilarea dicționarelor de forță brută și, de asemenea, ascunde faptul de a stoca aceleași parole folosite de diferiți utilizatori. De asemenea, eficiența schemei crește dacă se folosește amestecarea netrivială conform unui algoritm. De exemplu, sarea nu poate fi adăugată numai la sfârșitul parolei, ci „amestecată” la anumite intervale ale parolei. În plus, hash-ul poate fi calculat ciclic, amestecând sarea în părți cu unele modificări [3] , în funcție de numărul de iterație de hashing .

Unul dintre standardele bine-cunoscute PBKDF2 descrie amestecarea sării în mai multe iterații.

Un exemplu de stocare a acelorași parole de la diferiți utilizatori, sub rezerva unei sări (dinamice) generate personal
Nume de utilizator parola md5 (parolă) sare parola+sare md5 (parolă+sare)
utilizator1 qwerty123 3fc0a7acf087f549ac2b266baf94b8b1 5h8Uh32Hr qwerty1235hr8Uh32Hr 1dfa98fc519fc0022e86014445d8b158
utilizator2 qwerty123 3fc0a7acf087f549ac2b266baf94b8b1 Ju5yFy35Jk qwerty123Ju5yFy35Jk 269777fd3b1c37ef1cfc1e238213324f

Tabelul de mai sus arată că aceleași parole de utilizator cu săruri dinamice diferite vor da în cele din urmă valori hash diferite.

Probleme cu sarea și puterea parolei

Cu acces neautorizat la baza de date a sistemului de autorizare, un atacator poate obține informațiile necesare pentru a transmite autorizarea în numele utilizatorilor din această bază de date. Dacă parolele sunt stocate în forma lor originală (clară), un atacator le poate folosi pentru a accesa alte resurse, deoarece utilizatorii folosesc adesea aceleași parole pentru diferite servicii web [4] . Utilizarea unei sare dinamice vă permite să evitați compromiterea conturilor de utilizator pe mai multe servicii web simultan.

Cu un sistem prost gândit pentru utilizarea sării, avantajele sale se pierd:

Lungime mică de sare și entropie scăzută

Dacă sarea este scurtă, va fi ușor pentru un atacator să creeze o masă curcubeu constând din toate sărurile posibile de o anumită lungime, adăugate la fiecare parolă posibilă. De asemenea, utilizarea unei sări cu entropie scăzută va crește șansa de a găsi cu succes sarea în dicționar, astfel încât valoarea sării ar trebui generată în mod ideal folosind un RNG [5] . Utilizarea unei sare lungi cu entropie bună asigură că tabelul curcubeu pentru baza de date va fi prea mare și va necesita resurse semnificative ale atacatorului pentru a genera și stoca [6] .

Reutilizarea sării pentru diferite prototipuri

Deși folosirea unei sări statice pentru aceleași preimagini va face inutile unele tabele curcubeu existente, trebuie remarcat că, dacă sarea este scrisă static în codul sursă al unui produs popular, atunci mai devreme sau mai târziu poate fi extrasă, după care o nouă Din această sare poate fi creată masa curcubeu. Dacă sarea este generată dinamic pentru fiecare preimagine individual, folosind niște parametri unici pentru fiecare utilizator, atunci stabilitatea sistemului crește.

Utilizarea unei sări fixe înseamnă, de asemenea, că fiecare utilizator care introduce aceeași parolă va avea același hash. Acest lucru face mai ușor să ataci mai mulți utilizatori prin spargerea doar a unuia dintre hashurile repetate [7] .

Beneficiile folosirii sării în sistemele de autorizare

Pentru a înțelege diferența dintre spargerea unei singure parole și introducerea lor, luați în considerare un fișier de parole care conține sute de nume de utilizator și parole codificate. Fără o sare, un atacator poate calcula un hash de o anumită valoare (de exemplu, dintr-un dicționar) și apoi poate verifica pentru a vedea dacă acel hash apare oriunde în fișier. Probabilitatea unei potriviri, adică spargerea uneia dintre parole, crește în mod evident odată cu numărul de parole din fișier. Dacă se folosește o sare și, în plus, este dinamică, adică are cel puțin mai multe valori posibile pentru un hash, atunci atacatorul trebuie să calculeze hash-ul pentru fiecare posibilă pereche de sare și parola căutată, ceea ce în mod dramatic. crește complexitatea căutării.

Sarea vă permite, de asemenea, să contracarați utilizarea tabelelor hash pentru a sparge parolele. În cazul parolelor de utilizator, un tabel hash este o colecție de hashuri precalculate pentru parolele utilizate frecvent. Pentru un fișier cu parole nesărate, un atacator ar putea parcurge fiecare intrare și poate găsi parola hash corespunzătoare în tabelul hash. Deoarece căutarea este mult mai rapidă decât calculul hash, acest lucru va accelera foarte mult procesul de spargere a parolelor. Dar dacă fișierul cu parole este format cu o sare, atunci tabelul hash trebuie să conțină valori pre-hash cu sare. Dacă sarea este suficient de lungă și are o entropie mare (este aleatorie), atunci probabilitatea de rupere este redusă drastic. Parolele nesărate alese de oameni sunt în general vulnerabile la atacurile din dicționar, deoarece sunt de obicei alese pentru a fi scurte și suficient de ușor de reținut. Chiar și un mic dicționar (sau echivalentul său hash, un tabel hash) este de mare ajutor în spargerea celor mai frecvent utilizate parole.

Din punct de vedere tehnic, sarea protejează împotriva tabelelor hash și a tablelor curcubeu, deoarece în esență extinde lungimea și potențiala complexitatea parolei . Dacă nu există parole în tabelele curcubeu care se potrivesc cu lungimea (de exemplu, parola de 8 octeți și sare de 12 octeți, care este în esență o parolă de 20 de octeți) și complexitatea (sarea complexă cu entropie mare crește complexitatea parolelor alfanumerice simple și puternice) parola , parola nu va fi găsită.

Sistemul modern de parole umbră , în care hash-urile parolei și alte date de securitate sunt stocate într-un fișier non-public, rezolvă parțial problema accesului neautorizat la fișierul hash. În același timp, ele rămân relevante în instalațiile cu mai multe servere care folosesc sisteme centralizate de gestionare a parolelor pentru a transfera parole sau hash-uri de parole către mai multe sisteme [8] .

Salt face, de asemenea, atacurile de dicționar și atacurile de forță brută pentru spargerea unui număr mare de parole extrem de lente (dar nu și în cazul spargerii unei singure parole). Fără o sare, un atacator care sparge un set mare de parole este forțat să compare de fiecare dată cu toți candidații. Având în vedere că sarea poate fi dinamică, atunci fiecare opțiune de sare ar trebui încercată să se aplice fiecărei parole din listă.

Un alt avantaj al unui salt este că doi utilizatori pot alege același șir ca parola lor, sau același utilizator poate folosi aceeași parolă pe două computere. Fără sare, această parolă va fi stocată ca același șir hash în fișierul cu parole. Acest lucru ar dezvălui faptul că cele două conturi au aceeași parolă, permițând oricui care cunoaște una dintre parolele contului să acceseze celălalt cont. Când sarea este amestecată, chiar dacă două conturi folosesc aceeași parolă, nimeni nu o poate detecta pur și simplu uitându-se la valorile hash.

Salt pe sisteme UNIX

Majoritatea sistemelor UNIX folosesc biblioteca de sistem crypt(3) ca o funcție unidirecțională . Inițial, această bibliotecă a folosit o funcție hash bazată pe algoritmul DES . În acest caz, parola a fost limitată la 8 caractere (7 biți per caracter, adică 56 de biți), și a fost folosită o sare de 12 biți [9] .

În 1994, Poul-Henning Kamp a creat un nou algoritm de hashing a parolelor bazat pe MD5 care permitea parole de orice lungime și folosea o mie de iterații ale MD5 [10] [11] . Rezultatul funcției a fost un șir care conține eticheta algoritmului de hashing (versiune), sare și hash.

La acea vreme, întârzierea calculării unui astfel de hash era suficientă pentru a rezista efectiv ghicirii parolelor prin forță brută. Cu toate acestea, pe măsură ce puterea de calcul a crescut, timpul de a găsi MD5 a scăzut dramatic. Acest lucru a condus la apariția unor algoritmi mai complecși din punct de vedere computațional în criptă și control asupra numărului de iterații [12] .

Biblioteca acceptă acum mai multe funcții hash bazate pe algoritmi: MD5 , SHA-256 , SHA-512 , Blowfish (în unele distribuții Linux , OpenBSD și alte sisteme asemănătoare UNIX) [13] . Rezultatul funcției este un șir care conține eticheta algoritmului de hashing, sare, hash și alte date (de exemplu, numărul de runde ale funcției hash).

În 2012, Poul-Henning Kamp a cerut abandonarea completă a algoritmului md5crypt pe care l-a creat, deoarece acesta nu asigură o creștere tangibilă a timpului de calcul al hashului în condiții moderne și, prin urmare, nu protejează împotriva unei enumerari exhaustive [14] .

Vezi și

Note

  1. Un studiu despre parole . Security-Corp.org - o resursă dedicată problemelor de securitate a informațiilor. Preluat la 14 decembrie 2019. Arhivat din original la 14 decembrie 2019.
  2. Ce parolă va proteja împotriva hackingului sau a entropiei în serviciul secretului . samag.ru. Preluat la 14 decembrie 2019. Arhivat din original la 14 decembrie 2019.
  3. Schimbarea parolei „Sărat”: se face corect . Internet technologies.ru. Preluat la 14 decembrie 2019. Arhivat din original la 14 decembrie 2019.
  4. Club.CNews.ru: 52% dintre utilizatori folosesc aceleași parole pe site-uri diferite . Club.CNews.ru. Preluat la 14 decembrie 2019. Arhivat din original la 14 decembrie 2019.
  5. Generatoare de numere aleatorii în criptografie . studopedia.net. Preluat la 14 decembrie 2019. Arhivat din original la 14 decembrie 2019.
  6. Viteza forței brute a parolei pe CPU și GPU . bozza.ru Preluat la 14 decembrie 2019. Arhivat din original la 14 decembrie 2019.
  7. Milioane de utilizatori Microsoft folosesc parole repetitive . i2HARD. Preluat la 14 decembrie 2019. Arhivat din original la 14 decembrie 2019.
  8. Stocare distribuită a hash-urilor parolelor - „Hacker” . Preluat la 14 decembrie 2019. Arhivat din original la 14 decembrie 2019.
  9. Proiect OpenNet: MAN crypt(3) Apeluri de bibliotecă (FreeBSD și Linux) . Consultat la 24 iunie 2012. Arhivat din original pe 26 iunie 2012.
  10. Jurnal FreeBSD CVS pentru src/lib/libcrypt/crypt.c . Preluat la 9 iulie 2012. Arhivat din original la 12 iulie 2013.
  11. Niels Provos, David Mazières. O schemă de parole adaptabilă în viitor . Lucrare - 1999 USENIX Annual Technical Conference, 6-11 iunie 1999, Monterey, California, SUA (iunie 1999). Preluat la 9 iulie 2012. Arhivat din original la 9 august 2012.
  12. Cripta Unix cu SHA-256/512 . Consultat la 24 iunie 2012. Arhivat din original la 16 iulie 2013.
  13. crypt(3) - Pagina de manual Linux . Consultat la 24 iunie 2012. Arhivat din original pe 2 mai 2012.
  14. Md5crypt Password scrambler nu mai este considerat sigur de către autor (downlink) . Preluat la 9 iulie 2012. Arhivat din original la 17 martie 2018. 

Literatură