Hashing parole
Stocarea parolelor de utilizator este unul dintre cele mai rele lucruri posibile pe care le puteți face în text simplu și una dintre cele mai frecvente greșeli de securitate. Remedierea există de zeci de ani - hashing parole cu algoritmi lenți, cu memorie grea -, dar diferența dintre implementările bune și rele este enormă, iar majoritatea încălcărilor de date dezvăluie alegeri proaste.
Întregul articol al articolului este oferit în limba engleză mai jos.
Password hashing este practica de stocare a unei transformări unidirecționale a parolei unui utilizator în locul parolei în sine. Când utilizatorul se conectează, aceeași transformare este aplicată intrării sale și comparată cu valoarea stocată. Dacă baza de date stocată este încălcată, atacatorul are hash-uri, nu parole – iar recuperarea originalelor ar trebui să fie imposibilă din punct de vedere computațional.
Aceasta este teoria. Practica variază de la „funcționează așa cum este anunțat” la „s-ar putea să fi fost la fel de bine text simplu”, în funcție de algoritmul și parametrii aleși.
De ce are nevoie de un hash de parolă bun
- One-way. Cunoașterea hash-ului nu ar trebui să dezvăluie nimic util despre hash parola.
- Salted. Fiecare utilizator are o sare unică aleatorie amestecată în hash. Împiedică tabelele curcubeu precalculate și asigură că parolele identice produc hashuri diferite.
- Slow. Un singur calcul hash ar trebui să dureze o fracțiune semnificativă de secundă pe hardware-ul atacatorului. Forța brută de miliarde pe secundă este ceea ce învinge hashe-urile rapide.
- Memory-hard. Fiecare hash ar trebui să necesite RAM semnificativ, înfrângând paralelizarea GPU și ASIC care prosperă pe o memorie mică pe instanță. reglabil în sus pe măsură ce hardware-ul devine mai rapid.
Alegeri greșite
Algoritmi pe care nu trebuie să-i folosiți niciodată pentru stocarea parolelor:
- MD5. Criptografic rupt de zeci de miliarde de secunde. pe hardware de consum.
- SHA-1, SHA-256. Hashe-uri criptografice rapide concepute pentru verificarea integrității, nu stocarea parolelor. Brute-fortable la miliarde pe secundă pe GPU-uri.
- Encriptate parole. Dacă le puteți decripta înapoi în text simplu, un atacator care fură cheia poate și ele. Hashing este răspunsul; criptarea nu este.
- Plaintext. Se întâmplă încă în 2026. Fiecare încălcare a parolei de text simplu poate fi prevenită. algoritmi:
- bcrypt (1999). Factorul de cost ajustabil (runde de calcul). Limitat la parole de 72 de octeți. Nu este greu de memorie, așa că GPU-urile îl pot ataca eficient, dar un factor de cost rezonabil face atacurile în continuare costisitoare. Implementare largă, simplu de utilizat corect.
- scrypt (2009). Greu de memorie. Costul memoriei configurabile, paralelismul și costul CPU. Mai complex decât bcrypt; uneori configurat greșit.
- Argon2 (câștigător 2015 Password Hashing Competition). Trei variante: Argon2d (dependent de date, rezistent la atacurile GPU, dar vulnerabil la canalele laterale), Argon2i (independent de date, rezistent la canalul lateral), Argon2id (hibrid - implicit recomandat). Modern, bine verificat, alegerea potrivită pentru sisteme noi.
OWASP recomandă în prezent Argon2id cu memorie de cel puțin 19 MB, număr de iterații de 2 și paralelism de 1. Pentru sistemele în care Argon2 nu este disponibil, bcrypt cu cost ≥ 10 sau scrypt cu parametri adecvați sunt acceptabili. „lent” înseamnă în practică
Factor de cost de 10 în bcrypt înseamnă aproximativ 100 ms per hash pe hardware-ul modern. Pentru un utilizator legitim care se conectează, acest lucru este imperceptibil. Pentru un atacator care încearcă să forțeze brute 100 de milioane de parole dintr-o bază de date scursă, este 100 de milioane × 100 ms = 116 zile de timp GPU per trecere printr-o listă de cuvinte rezonabilă. Combinate cu o sare unică per utilizator, mesele mari curcubeu sunt inutile.
Pentru un hash rapid precum SHA-256 nesărat, aceeași operațiune durează câteva minute pe același hardware.
Manevrarea sării
- PRNG este generată de utilizator de către utilizator creation
- 16 bytes este suficient (128 de biți de aleatorie)
- Salt este stocat alături de hash, nu secret - sarcina sa este să fie unică, nu ascunsă
- Cele mai moderne biblioteci de hashing (bcrypt, ieșiri Argon2, format PHC, parametru și algorith, sare în parametrul hash și algorithm) un singur șir
Pepper: opțional extra
A pepper este o valoare secretă la nivelul întregului site adăugată la intrarea hash, stocată separat de baza de date (într-un HSM, seif de chei sau configurație de aplicație). Dacă baza de date este aruncată, dar piperul nu este, hashe-urile sunt irecuperabile chiar și cu sarea utilizatorului - deoarece atacatorul nu are piperul. Piperul este un adaos util de curele și bretele pentru sistemele de mare valoare.
Actualizarea hashurilor în siguranță
Când modificați parametrii sau migrați algoritmii, nu puteți rehash fără parola originală. Abordarea standard:
- Efiecare înregistrare de utilizator își stochează algoritmul de hash curent, parametrii, sare și hash.
- La conectare, verificați față de hash-ul stocat cu parametrii săi originali.
- IDacă verificarea reușește, iar parametrii sunt depășiți și actualizați parametrii actuali. record.
În câteva luni de utilizatori activi, baza de date trece la noi parametri fără a forța resetarea parolei.
Ce înseamnă aceasta pentru utilizatori
Pentru utilizatorii finali, efectul practic: chiar și atunci când o bază de date este încălcată, o parolă unică puternică (gestionată) 7 hashing pe server înseamnă că parola rămâne efectiv secretă. Parolele slabe sunt sparte chiar și din baze de date bine analizate; utilizatorul este variabila pe care un dezvoltator nu o poate controla.
Întrebări frecvente
- De ce bcrypt este limitat la 72 de caractere?
- Detaliu istoric de implementare a cifrului Blowfish de bază. Intrările mai lungi sunt trunchiate. Majoritatea utilizatorilor nu observă; o expresie de acces aleatoare de 16 caractere este mult sub limita. Pentru sistemele care doresc o lungime nelimitată a parolei, Argon2 nu are o astfel de restricție.
- Ar trebui să îmi sare și să piper parolele?
- Sarea este necesară (și orice bibliotecă de renume o face automat). Pepper este opțional, dar valoros pentru sistemele de înaltă securitate. Compensație: gestionarea ardeiului ca secret pe termen lung în afara bazei de date adaugă complexitate operațională. Majoritatea aplicațiilor stochează sare + hash; cele mai mari depoziteaza sare + hash + hash derivat din piper.
- Argon2 este întotdeauna mai bun decât bcrypt?
- Pentru sisteme noi, da. Argon2 este greu de memorie (rezistent la GPU/ASIC), nu are limită de 72 de caractere și a câștigat competiția de hashing a parolelor din motive întemeiate. bcrypt este încă acceptabil atunci când Argon2 nu este disponibil sau constrângerile organizaționale preferă standardul mai vechi. Pentru sistemele vechi care utilizează bcrypt cu cost ≥ 10, urgența de a migra este scăzută.
- Cât timp ar trebui să dureze pentru hashing o parolă?
- OWASP sugerează aproximativ 100-500 ms pe hardware-ul serverului. Mai rapid înseamnă mai slab împotriva atacatorilor; mai lent începe să afecteze experiența de conectare legitimă. Numărul potrivit depinde de traficul dvs. — serviciile de mare volum aleg costuri mai mici; Serviciile de înaltă securitate cu rate scăzute de conectare pot alege mai mult.
- Pot stoca parole criptate în loc de hashing?
- Nu. Criptarea este reversibilă, ceea ce înseamnă că cheia de criptare trebuie să existe undeva unde aplicația poate accesa. Dacă baza de date este încălcată, cheia este deseori și ați stocat efectiv text simplu. Ireversibilitatea hashing-ului este esențiala - chiar și propria aplicație nu poate recupera parola, care este proprietatea de securitate.