Cum se face parola și cum nu

Încă o dată, finalizând auditul securității informațiilor a proiectului web, barilul meu personal, cu furie, a fost plin de indignare, astfel încât acesta sa revărsat la marginea acestui post.







Voi încerca foarte scurt și rapid descrierea situației cu hashes.

Matchmaking (scurt)


Hash = funcția hash - (convoluție) funcție de cartografiere unică a unui șir (de orice lungime) într-un set finit (un șir de o anumită lungime).
Numărul real (șir) al hash-urilor este rezultatul calculării unei funcții hash peste date.
Există funcții hash criptografice și non-criptografice (clasificate separat, acestea includ, de exemplu, sumele de control).

Pentru hashes criptographic, există trei condiții suplimentare care le distingă de toate celelalte:

  • Ireversibilitate: pentru o valoare dată a funcției hash m, trebuie să fie imposibil de calculat să găsim un bloc de date X pentru care H (X) = m.
  • Rezistența la coliziuni de primul tip: pentru un mesaj dat M, trebuie să fie imposibil de calculat să selectăm un alt mesaj N pentru care H (N) = H (M).
  • Rezistența la coliziuni de tipul celui de-al doilea: trebuie să fie imposibilă din punct de vedere computațional să se ia o pereche de mesaje

Nu este necesar să se pătrundă în detaliile criptografiei către un dezvoltator de aplicații, este suficient să ne amintim care funcții de hash (algoritmi după nume) pot fi acum utilizate și care nu mai există. MD5 - nu mai sunt disponibile, colegi, - utilizează bcrypt / scrypt.

În aplicațiile web, printre altele, funcțiile hash sunt folosite pentru a stoca în siguranță secrete (parole) în baza de date.
Este funcția hash care devine ultima dvs. fortăreață, dacă atacatorul ar putea reduce atacul la un atac local asupra sistemului de autentificare. Despre atacurile online (cereri de parole HTTP brute-force), poate că altcineva va scrie mai târziu.

Următoarele sunt cerințele pe care hașurile dvs. din baza de date trebuie să le îndeplinească:

  • Rezistent la atacurile de forță brute (forța bruta și căutarea dicționarului)
  • Incapacitatea de a căuta parole identice pentru diferiți utilizatori prin hash

Pentru a îndeplini prima cerință, trebuie să utilizați funcția persistentă (și nu în anii 90!) Hash.
Pentru a executa al doilea, un șir aleator (sare) este adăugat la parolă înainte de hashing. Astfel, doi utilizatori cu parola „123456“ va fi diferit de sare „sol1“ și „sol2“ și, în consecință, funcția hash din „123456sol1“ și „123456sol2“ în baza de date va fi, de asemenea, diferite.

Acum un pic despre sistemul de stocare - și sarea și hash-ul în sine sunt stocate în baza de date.
Aceasta înseamnă că, având acces la DBMS, atacatorul primește valorile hashes și sare.

Utilizați parametrul local!


Pentru a complica viața atunci când atacați căutarea, trebuie să adăugați sare la parolă și nu invers (pentru cei care scriu de la stânga la dreapta, desigur).
Deoarece o funcție hash, ca regulă, este calculată secvențial pe un șir (cerințele de filetare algoritmică), atunci un atacator cu o căutare pentru hashes "sărat" va fi mai ușor atunci când expresia subcătuială începe cu sare.
Pur și simplu pentru că el (atacatorul) poate precalculation hash avans (sare) și să își asume în continuare hash (sare) + hash (parola) este deja mult mai rapid (aproape aceeași viteză ca un hash (parolă)). Pentru toate parolele pe care le va sorta.

Aceasta este, în esență, "a doua sare" este adăugată la toate construcțiile (parole + sare) și este aceeași pentru toate hashes-urile din baza de date. Care este trucul? Faptul că nu există parametru local în baza de date. Aceasta este constanta sistemului, care este stocata in memoria aplicatiei, unde vine de la config (in nici un fel, nu numai din baza de date).







O măsură foarte simplă și eficientă care elimină aproape complet atacul forței brute bazat pe date dintr-un singur magazin hash (fără a cunoaște parametrul local).

Singura dată când am (ONsec) a rupt hash-uri cu un parametru locale, care au dezvoltat în timpul acestui atac tactici pe parametru locale în sine (ne sunt înregistrate în cerere, uita-te apoi în bazate pe hash, sare (parola, noi știm deja) și iterăm LP). Și în zadar. La lungimi de 16+ octeți pentru funcțiile de hashing moderne - acest lucru este foarte scump pentru hardware. Ca urmare, a fost mai ușor să compromităm sistemul de autentificare (să vă puneți un rol = admin în baza de date prin UPDATE;))

Protejați-vă depozitul în siguranță și corect!

concluzie


Voi fi un realist - desigur, nimeni nu își va rescrie proiectele de dragul unor "hashes". Dar proiectele noi pot fi scrise la scrypt / bcrypt. Și de asemenea - implementați parametrul local chiar și pe MD5 slab - este foarte util, este verificat :)

La trecerea la un tip diferit de hașcare, în plus față de muncă, există adesea o problemă de performanță. Într-adevăr, algoritmii mai robili consumă mai multe resurse. Testați înainte de implementarea încărcărilor lor pe viteza de autentificare a utilizatorului pe secundă (pentru majoritatea proiectelor mari, trecerea la scripturi a fost nedureroasă). Alegerea unui tip ideal de hash într-o anumită situație poate varia foarte mult. De exemplu, RBS alege din ce în ce mai multe soluții de fier pentru a genera hashes cu o viteză dată.

În concluzie, citez viteza hash-ului (megashes per secundă, adică numărul) măsurat pe cardul AMD Radeon 7990 cu un cost mai mic de 1000 $ (chiar și în vechiul curs):

Cum se face parola și cum nu

Comandarea parolei în PHP 5.5 folosind noul API
Utilizarea BCrypt este o metodă comună și cea mai bună pentru parolele de hash, dar un număr mare de dezvoltatori folosesc algoritmi vechi și slabi, cum ar fi MD5 și SHA1. Unii dezvoltatori nu folosesc nici măcar sare pentru hashing. Noua interfață de tip hash în PHP 5.5 își propune să atragă atenția asupra lui BCrypt, simplificând lucrul cu acesta

Cum se face parola și cum nu

Funcțiile hash non-criptografice și atacul DoS asupra lor
Funcțiile hash non-criptografice sunt utilizate acolo unde viteza este importantă și posibilitatea de a ataca caracteristicile funcției nu este atât de importantă. Ultima dată când un atac activ asupra complexității algoritmice a tabelelor hash este discutat în mod activ prin crearea de coliziuni multiple ale unei funcții hash care poate duce la DoS. Vom analiza funcțiile moderne de tip hash non-cryptographic,

Cum se face parola și cum nu

Cel mai bun mod de a stoca setările de parole
După cum știm cu toții, parolele ar trebui să fie întotdeauna rulate folosind un algoritm lent folosind sare. Cea mai obișnuită utilizare este scrypt, bcrypt sau PBKDF2, dar acest post nu este despre ce algoritm să utilizați. În schimb, vom vorbi despre ce să facem cu hash-urile în continuare. Sarea de 20 de (sau 32-) octeți și hash-ul ar trebui să fie depozitate într-o zonă non-volatilă,

Cum se face parola și cum nu

Un pic despre hași și stocarea sigură a parolelor
Bună ziua! Astăzi, în procesul de dezvoltare a unui sistem de autentificare pentru proiectul meu, m-am confruntat cu alegerea modului de păstrare a parolelor utilizator în baza de date. Multe opțiuni vin în minte. Cel mai evident: păstrați parolele în baza de date clar. Utilizați hashes-urile normale crc32, md5, sha1.

Cum se face parola și cum nu

Despre dogme în criptografie
Ieri, am lansat in sfarsit prima versiune publica a lui Lamer News, este un adevarat exemplu de folosire a Redis sub forma unui site aflat in partea de jos a site-ului Hacker News, precum si un proiect al unui site web complet independent despre stiri din lumea programarii. Proiectul a fost bine primit de către comunitate și sa aflat în vârful HN de ceva timp. Vă mulțumim pentru feedback.







Trimiteți-le prietenilor: