Zašto spor heš
Kad baza procuri, napadači pogađaju lozinke offline prema sačuvanim hešovima. Brz heš kao SHA-256 omogućava jednom GPU-u oko deset milijardi pokušaja u sekundi, što većinu lozinki koje su ljudi izabrali pretvara u otvoreni tekst za nekoliko sati. Funkcije za heširanje lozinki su namerno spore i, u novijim dizajnima, gladne memorije, tako da svaki pokušaj napadača košta koliko i vas, a hiljade jezgara GPU-a ne pomažu jer dele premalo memorije.
| Funkcija | Godina | Podesivo | Preporučeno (OWASP 2024) | Koristite kad |
|---|---|---|---|---|
| Argon2id | 2015 | memorija, prolazi, trake | m=19 MiB, t=2, p=1 (ili m=64 MiB, t=3) | Podrazumevano za nove sisteme. Pobednik Password Hashing Competition. |
| scrypt | 2009 | N, r, p | N=2¹⁷, r=8, p=1 | Memorijski zahtevan; dobar tamo gde Argon2 nije dostupan. |
| bcrypt | 1999 | cena (2ⁿ rundi) | cena 10 ili više | Svuda; i dalje solidan. Seče na 72 bajta. |
| PBKDF2 | 2000 | iteracije | 600.000 (SHA-256) | FIPS usklađenost; nije memorijski zahtevan, pa je najslabiji protiv GPU-a. |
Čitanje heš stringa
$2b$12$ + 22 znaka soli + 31 heša: bcrypt, cena 12 (4.096 rundi). $argon2id$v=19$m=19456,t=2,p=1$salt$hash: Argon2id sa parametrima u stringu, Base64 bez paddinga. Oba formata nose sve što je potrebno za proveru, pa cenu možete vremenom da povećavate i ponovo heširate korisnike pri sledećoj prijavi. scrypt i PBKDF2 nemaju univerzalni format stringa; so i parametri se čuvaju pored, zbog čega provera traži so posebno.
Izbor cene
Ciljajte na otprilike 100–300 ms po hešu na vašem serveru. Ova stranica prijavljuje koliko je svaki heš trajao u vašem pregledaču (pristojan laptop je uporediv sa malim serverskim jezgrom). Argon2 na preporučenih 19 MiB traje oko sekundu u JavaScriptu; nativne implementacije su nekoliko puta brže.
Šta ne raditi
Ne koristite MD5, SHA-1 ili SHA-256 same, čak ni sa solju. Ne koristite jednu so za ceo sajt. Ne pre-heširajte sa SHA-256 da zaobiđete bcrypt ograničenje od 72 bajta, osim ako rezultat i ne kodirate u Base64 (sirovi bajtovi mogu da sadrže NUL, na kome bcrypt staje). I ne lepite prave produkcione lozinke ni u jednu veb stranicu, uključujući ovu; koristite test vrednosti.
Pitanja
Da li je bezbedno koristiti ovu stranicu sa pravom lozinkom?
Heširanje se izvršava u vašem pregledaču i ništa se ne prenosi, ali razumno pravilo je da svaku veb stranicu tretirate kao nepouzdanu za žive kredencijale. Koristite je za generisanje hešova za test podatke, za razumevanje formata i za proveru sa jednokratnim lozinkama.
Zašto bcrypt svaki put daje drugačiji heš?
So je nasumična pri svakom pozivu; čuva se unutar heš stringa. Provera je izvlači i ponovo računa. Očekuje se da se dva heša iste lozinke razlikuju; oba prolaze proveru.
Zašto moja bcrypt provera ne uspeva za dugačku lozinku?
bcrypt koristi samo prva 72 bajta. Ako je lozinku heširala biblioteka koja pre-hešira (neke Django i Passlib konfiguracije), sirova bcrypt provera ovde se neće poklopiti. Proverite i prefiks: $2y$ i $2b$ hešovi su kompatibilni; $2x$ označava implementaciju sa greškom.
Šta znače m, t i p u Argon2?
m je memorija u KiB (19456 = 19 MiB), t je broj prolaza kroz tu memoriju, p je broj traka koje mogu da se izvršavaju paralelno. Memorija je glavni bezbednosni regulator: ona čini GPU i ASIC napade skupim.