Riscuri și provocări parola hashing, savepearlharbor

Siguranța a fost întotdeauna un subiect controversat care provoacă numeroase dezbateri aprinse. Și toate datorită abundenței de o varietate de puncte de vedere și „soluția ideală“, care a satisfăcut unele și complet nepotrivit pentru alții. Eu cred că sistemul de securitate aplicație pauză este doar o chestiune de timp. Datorită creșterii rapide a puterii de calcul și de a crește complexitatea securității astăzi nu mai este mâine să fie o astfel de cerere.

  • Funcția One-way. hash a datelor originale nu pot fi restaurate cu ajutorul unui algoritm eficient.
  • Conversia datelor de lungime variabilă în date cu lungime fixă. valoarea de intrare poate fi de lungime „infinită“ și de ieșire - nr. Acest lucru implică faptul că două sau mai multe valori de intrare pot avea același hash. Este mai mică lungimea hash, cu atât mai mare probabilitatea de coliziune.

MD5 algoritmi SHA-1, și nu oferă o fiabilitate suficient de mare în ceea ce privește probabilitatea de coliziuni (vezi. Zi de nastere paradox). Prin urmare, se recomandă utilizarea de algoritmi care genereaza hash-uri mai lungi (SHA-256, SHA-512. Whirlpool, etc.), ceea ce face ca probabilitatea unei coliziuni neglijabile. Astfel de algoritmi sunt numite și „funcție pseudo-aleatoare“, adică. E. Rezultatele muncii lor sunt imposibil de distins de rezultatele generatorului de numere aleatorii de grad înalt (adevărat generator de numere aleatorii. TRNG).

Faptul că, cu ajutorul unui algoritm eficient este imposibil de a efectua operația, inversa hash și de a recupera datele originale, nu înseamnă că nu poți hack. Dacă veți căuta bine, puteți găsi o bază de date de hash-uri cuvinte comune și fraze scurte. În plus, parole simple pot fi rapid și ușor fisura sau brute force dicționarul brute force.

Aici este o mică demonstrație de instrument de modul în care sqlmap prin introducerea SQL-cod hacks parole folosind hash-uri brute force generate de algoritmul MD5.

Atacatorii pot face chiar mai ușor - naguglit hashes specifice în baza de date on-line:

Pentru a împiedica atacul descris fel este folosit așa-numita sare. Acest mijloace standard, dar în condiții de putere de calcul moderne, nu mai este suficientă, în special în cazul în care sărurile de lungime este mică.

În general, funcția cu utilizarea de sare poate fi reprezentată după cum urmează:

f (parolă, sare) = hash (parola + sare)

Pentru dificultăți brute sare atacuri de forță ar trebui să fie de cel puțin 64 de caractere. Dar problema este că, în scopul de a autentifica utilizatorii în continuare de sare ar trebui să fie stocate în baza de date în text simplu.

if (hash ([parola introdusă] + [G]) == [diez]), în cazul în care utilizatorul este autentificat

Datorită sării unic pentru fiecare utilizator, putem rezolva problema coliziunilor hash simple. Acum, toate vor fi diferite hash. De asemenea, nu va mai funcționa abordări și hash-uri gugleniya brute force. Dar dacă atacatorul prin punerea în aplicare a SQL-cod va avea acces la sare sau o bază de date, acesta va fi capabil să atace cu succes sau brute force brute force, dicționar, în special în cazul în care utilizatorii aleg parole comune (a la 123456).

Cu toate acestea, de rupere oricare dintre parolele nu mai sunt va calcula automat utilizatorii care au aceeași parolă - pentru că avem toate sunt diferite hash.

Pentru a genera sare adecvată avem nevoie de un bun generator de numere aleatoare. uita imediat despre funcția rand ().

În cazul în care computerul vrea număr aleator, apoi, de obicei, este nevoie de date din mai multe surse (de exemplu, variabile de mediu: ora, data, numărul de octeți înregistrate citit /, etc ...) apoi generează asupra lor de calcul pentru obținerea unei date „la întâmplare“. Prin urmare, aceste date sunt numite pseudorandom. Deci, dacă cumva recrea un set de condiții inițiale la momentul executării funcției de pseudo-aleatoare, atunci vom fi în măsură să genereze același număr.

În cazul în care generatorul de pseudo-aleatoare și puse în aplicare mai corect, datele generate de acesta poate detecta tiparele și să le utilizeze pentru a genera un rezultat prezis. Aruncati o privire la această imagine, care este un rezultat al randului PHP-funcția ():

Riscuri și provocări parola hashing, savepearlharbor

Și acum compară cu datele generate de generatorul de numere aleatoare complet:

Riscuri și provocări parola hashing, savepearlharbor

Din păcate, nici rand (), mt_rand audio () nu pot fi considerate instrumente adecvate pentru a asigura un nivel ridicat de siguranță.

Dacă aveți nevoie pentru a obține date aleatoare folosind openssl_random_pseudo_bytes function (). care este disponibil începând cu versiunea 5.3.0. Ea are chiar pavilion crypto_strong, care spune de un nivel suficient de siguranță.

Puteți implementa o rezistență parolă, permite complica si mai mult atacurile brute force. Stretching este un algoritm iterativ sau recursiv care calculează în mod repetat hash în sine, zeci de mii (sau chiar mai mult).

Riscuri și provocări parola hashing, savepearlharbor

Numărul de iterații trebuie să fie astfel încât timpul total de calcul luate pentru cel puțin o secundă. Hash a obținut mai mult, atacator mai mult timp să-și petreacă pe hacking.

Pentru a sparge parolele cu o nevoie luxat:

  1. știu numărul exact de iterații, ca orice abatere va produce un hash diferit;
  2. așteptați cel puțin secunde între fiecare încercare.

Acest lucru face ca este foarte putin probabil ... dar nu imposibil atacul. Pentru a depăși a doua întârziere, atacatorul trebuie să utilizeze un calculator mai puternic decât cel sub care algoritmul hash a fost ajustat. În consecință, procesul de rupere poate necesita costuri suplimentare.

algoritmi standard pot fi utilizate, de exemplu PBDKDF2, care este o funcție cheie derivare a parolei se întinde.

Există, de asemenea, mai mult timp și consumatoare de memorie algoritmi, cum ar bcrypt (vom vorbi despre asta mai târziu) sau scrypt:

  • $ Costul - factor de intensitate a muncii;
  • $ Sare - un șir de caractere aleatoare. Este posibil să se genereze, de exemplu, prin intermediul funcției secure_rand () descrisă mai sus.

Factorul de intensitate a muncii depinde în întregime pe mașina pe care sunt hashing. Puteți începe cu valoarea 09 și crește treptat, până când ajunge la durata de funcționare de o secundă. Începând cu versiunea 5.5, puteți utiliza funcția password_hash (), vom discuta în continuare.

În momentul de față, nu în PHP suporta algoritmul scrypt, dar este posibil să se profite de punerea în aplicare a Domblack.

Mulți oameni sunt confuzi cu privire la termenii „hash“ și „criptare“. Așa cum sa menționat mai sus, hash - rezultatul unei funcții pseudo-aleatoare, în timp ce criptarea - punerea în aplicare a unei transformări pseudo-aleatoare. datele de intrare este împărțit în bucăți și prelucrate astfel încât rezultatul devine imposibil de distins de rezultatul muncii generator de numere aleatoare complet. Cu toate acestea, în acest caz, este posibil să se realizeze transformarea inversă și de a recupera datele originale. Transformarea este realizată folosind cheia cripto, fără de care este imposibil de a efectua conversia inversă.

Există o diferență importantă între criptare din hashingul: dimensiunea spațiului mesajului de ieșire nu este limitat și depinde de dimensiunea datelor de intrare la un raport de 1: 1. Prin urmare, nu există nici un risc de coliziune.

Cu ceva timp în urmă, Adobe are o bază de date puternică utilizator scurgeri din cauza criptare puse în aplicare în mod incorect. Să ne uităm la ceea ce au avut loc.

Riscuri și provocări parola hashing, savepearlharbor

Să presupunem că tabelul conține următoarele date în text simplu:

Riscuri și provocări parola hashing, savepearlharbor

Cineva de la Adobe a decis să cripta parolele, dar a făcut două greșeli mari:

  1. Am folosit același consumator Secret;
  2. câmp stânga passwordHint necriptat.

Să presupunem că masa a început după aspectul de criptare astfel:

Riscuri și provocări parola hashing, savepearlharbor

Nu știm ce a fost folosit Secret de consum. Dar dacă analizăm datele, putem vedea că liniile 2 și 7 folosesc aceeași parolă, precum și în liniile 3 și 6.

Este timpul să se întoarcă la parola prompt. Linia 6 este «eu sunt unul!», Care este destul de neinformativ. Dar, datorită liniei 3, putem presupune că parola - regina. Liniile 2 și 7 singur nu permit să se calculeze parola, dar atunci când le adăugați împreună, atunci putem presupune că acest Halloween.

De dragul de a reduce riscul pierderii de date este cel mai bun de a folosi un alt metode hashing. Și dacă aveți nevoie pentru a cripta parolele, apoi să acorde o atenție la criptarea personalizată:

Să presupunem că avem mii de utilizatori și dorim să cripta toate parolele. Așa cum sa arătat mai sus, este mai bine să se evite utilizarea unei singure cripto. Dar facem noi, de asemenea, nu se poate, pentru fiecare utilizator o cheie unică, deoarece stocarea cheie în sine devine o problemă. În acest caz, se aplică o suficient comună tuturor consumatorilor Secret, dar face „ajustare“, care este unic pentru fiecare utilizator. Combinația dintre cheie și „Setări“ și va fi o cheie unică pentru fiecare utilizator.

Cea mai simplă versiune a „Tuning“ - cheia primară așa-numitele. unic pentru fiecare înregistrare din tabel. Nu este recomandat să-l folosească în viața ta, aici este prezentat doar ca un exemplu:

f (cheie, primaryKey) = tasta + primaryKey

Aici este cheia și cheia primară este pur și simplu concatenate împreună. Dar de siguranță ar trebui să se aplice pentru a le hashing algoritm sau funcția derivare cheie (funcție cheie derivare). Este de asemenea posibil să se utilizeze o cheie unică pentru fiecare înregistrare a cheii primare în loc de (analog sare).

Dacă vom aplica criptarea noastră de masă configurabil, acesta va arăta astfel:

Riscuri și provocări parola hashing, savepearlharbor

Desigur, veți avea nevoie de ceva de a face cu sfaturi de parole, dar încă mai trebuie să obțină cel puțin ceva adecvat.

Rețineți că criptarea - nu este o soluție ideală pentru stocarea parolelor. În legătură cu punerea în aplicare a amenințărilor de cod sunt cele mai bune evitate această metodă de protecție. Pentru a stoca parolele în siguranță, este de a utiliza algoritmul bcrypt. Dar noi nu trebuie să uităm că chiar și cele mai bune și soluțiile dovedite au vulnerabilități.

Astăzi, cea mai bună cale este de a utiliza o parolă bcrypt hashing. Dar mulți dezvoltatori încă preferă algoritmii vechi și mai slabe, cum ar fi MD5 și SHA-1. Și unii hashing nu folosesc nici măcar sare. În PHP 5.5 a introdus un nou API pentru hash, care nu numai că promovează utilizarea bcrypt, dar, de asemenea, semnificativ mai ușor de a lucra cu el. Să ne uităm la elementele de bază ale acestui nou folosind API-ul.

Aici sunt patru funcții simple sunt utilizate:

  • password_hash () - Parola hashing;
  • password_verify () - compararea parolei cu hash;
  • password_needs_rehash () - parola pereheshirovanie;
  • password_get_info () - returnează numele algoritmului hash, și aplicate în cursul unui hash de opțiuni.

In ciuda nivelului ridicat de securitate furnizate de criptă funcția (), mulți consideră că este prea complicat, motiv pentru care programatorii fac adesea greseli. În schimb, unii dezvoltatori sunt folosite pentru a genera o combinație de hash săruri algoritmi slabi și slabi:

password_hash () funcție facilitează viața dezvoltator și îmbunătățește securitatea codului. Pentru parola hashing suficient pentru a alimenta funcția sa, și returnează un hash care poate fi plasat în baza de date:

Și totuși! Primul argument - codul ca un șir de caractere, al doilea argument specifică un algoritm pentru generarea hash. Bcrypt implicit, dar puteți adăuga un algoritm mult mai puternic, care va genera o linie de lungime mai mare, dacă este necesar. Dacă proiectul dumneavoastră utilizați PASSWORD_DEFAULT, apoi asigurați-vă că lățimea unei coloane pentru a stoca hashes cel puțin 60 de caractere. Mai bine doar pentru a seta 255 de caractere. Al doilea argument poate fi folosit PASSWORD_BCRYPT. În acest caz, hash va fi întotdeauna de 60 de caractere.

Vă rugăm să rețineți că nu trebuie să setați valoarea de sare, sau valoarea parametrului. Noul API va face totul pentru tine. Având în vedere că sarea este parte a hash, atunci nu trebuie să-l păstrați-i separat. Dacă aveți nevoie pentru a cere valoarea de sare (sau valoare), se poate face cu ajutorul celui de al treilea argument:

Toate acestea vă va permite să utilizați cele mai recente caracteristici de securitate. În cazul în care, în viitor, în PHP va fi un algoritm de hashing mai puternic, codul se va utiliza în mod automat.

Acum, ia în considerare o funcție hash comparație cu o parolă. În primul rând introduse de către utilizator, iar al doilea să luăm de la baza de date. Parola și hash este folosit ca cele două argumente password_verify funcția (). În cazul în care hash se potrivește cu parola, atunci functia returneaza true.

Amintiți-vă că sarea este parte a hash, deci nu este setat aici separat.

Dacă doriți să crească nivelul de securitate prin adăugarea unei sări mai puternică sau creșterea parametrilor de cost, sau să modificați algoritmul implicit tocare, atunci probabil doriți să pereheshirovat toate parolele. Această caracteristică ajută pentru a verifica fiecare hash pentru ceea ce algoritm și parametrii au fost utilizate în crearea sa:

Nu uitați că va trebui să facă acest lucru într-un moment când utilizatorul încearcă să vă conecta, deoarece aceasta este singura dată când va avea acces la parola în text simplu.

Această funcție are un hash și returnează un tablou asociativ cu trei elemente:

  • algo - constanta, care permite identificarea algoritmului;
  • algoName - numele algoritmului utilizat;
  • opțiuni - opțiuni de diferite valori aplicate în hashingul.

După cum puteți vedea, lucra cu noul API nu este un exemplu de mai bine decât criptă funcția stângace (). Dacă utilizați versiunile anterioare ale PHP, recomand să acorde o atenție la bibliotecă password_compact. Acesta emulează API și automat se oprește atunci când upgrade la versiunea 5.5.

Din păcate, până în prezent nu există nici o soluție perfectă pentru protecția datelor. În plus, există întotdeauna riscul de rupere a sistemului de securitate. Cu toate acestea, lupta proiectilului și armura nu se oprește. De exemplu, arsenalul nostru de remedii adăugate recent așa-numitele funcții burete.