Utilia

Bcrypt generator i provera lozinke

Generiši bcrypt heš sa faktorom troška od 4 do 14, proveri lozinku prema postojećem hešu i vidi njegovu verziju, trošak, so i vrednost heša.

Heširaj lozinku

Proveri lozinku prema hešu

Kako da heširaš lozinku pomoću bcrypt-a

  1. U odeljku Heširaj lozinku upiši Lozinka. Brojač prikazuje njenu dužinu u UTF-8 bajtovima i upozorava te kad pređe 72 bajta.
  2. Izaberi Faktor troška (4–14). Red ispod prikazuje broj rundi, na primer 10 → 2^10 = 1.024 runde.
  3. Klikni Generiši heš. Traka napretka prati rad, a stranica ostaje upotrebljiva dok traje. Kad se završi, alat prikazuje utrošeno vreme i Bcrypt heš, spreman za kopiranje.
  4. Heš je podeljen na delove: Verzija, Trošak, So (22 znaka) i Heš (31 znak).

Da proveriš lozinku prema hešu, upiši lozinku, nalepi heš (onaj koji si upravo generisao popunjava se automatski) i klikni Proveri lozinku. Rezultat kaže da li se poklapaju. Uključi Sakrij lozinke da zamaskiraš oba polja za lozinku.

Heširanje se izvršava u tvom pregledaču pomoću biblioteke bcryptjs, koja se učitava tek kad ti prvi put zatreba. Nijedna lozinka ni heš ne šalju se nigde.

Kako radi bcrypt

bcrypt (Provos i Mazières, 1999) je funkcija za heširanje lozinki zasnovana na šifri Blowfish. Za razliku od SHA-256, namerno je spor, a ta sporost se može podešavati: faktor troška je stepen broja dva, pa svako povećanje za 1 udvostručuje posao. Trošak 10 znači 1.024 iteracije skupog postavljanja ključa, a trošak 12 znači 4.096. Ta sporost jedva da se oseti kad se korisnik prijavljuje, ali pogađanje lozinki iz ukradene baze čini mnogo skupljim.

Heš poput $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy čita se ovako:

  • $2b$: verzija. $2a$ i $2y$ (PHP) su kompatibilne i mogu da se provere ovde, a $2x$ označava heševe iz stare implementacije sa greškom i odbija se.
  • 10: faktor troška.
  • Sledećih 22 znaka: nasumična 128-bitna so, u bcryptovoj sopstvenoj Base64 azbuci (./A-Za-z0-9).
  • Poslednjih 31 znak: 184-bitni rezultat.

Pošto je so nasumična i čuva se u samom hešu, heširanje iste lozinke dvaput daje dva različita heša, a oba se ispravno proveravaju. Zato se lozinka proverava funkcijom za proveru, a ne poređenjem heševa.

Izbor troška

Izaberi najveći trošak koji tvoj server može da priušti, a da prijave ostanu brze, obično oko četvrtine sekunde po hešu. OWASP preporučuje najmanji trošak 10 za bcrypt. Pregledači izvršavaju bcrypt u JavaScriptu, što je nekoliko puta sporije od izvorne serverske implementacije: od troška 12 alat upozorava da heširanje može trajati od jedne do nekoliko sekundi, a svaki dodatni korak udvostručuje vreme. Posao je podeljen na kratke delove, pa se stranica ne zamrzava.

Za nove sisteme OWASP sada preferira Argon2id, a bcrypt je i dalje prihvatljiv tamo gde Argon2id nije dostupan.

Ograničenje od 72 bajta

bcrypt koristi samo prvih 72 bajta lozinke, a sve posle toga tiho zanemaruje. Bajtovi nisu znakovi: slovo sa dijakritikom zauzima 2 bajta u UTF-8, a emodži 4. Dve duge lozinke koje dele prvih 72 bajta daju isti heš. Brojač bajtova upozorava te kad je lozinka predugačka. Neki sistemi unapred heširaju duge lozinke (na primer HMAC-SHA256, pa Base64) pre bcrypt-a. Ako to radiš, nikada ne prosleđuj sirove binarne vrednosti heša, jer bi nula-bajt u mnogim implementacijama prerano prekinuo lozinku.

Česta pitanja

Zašto ista lozinka svaki put daje drugačiji heš?

Svaki heš dobija novu nasumičnu so, koja se čuva unutar heša. Dugme Proveri lozinku čita so i trošak iz heša i ponovo ga izračunava, pa se svaka verzija ispravno proverava.

Može li bcrypt heš da se dešifruje?

Ne. bcrypt je jednosmerna funkcija. Jedini način da se lozinka povrati jeste da se pogađa i da se heširaju pokušaji, a upravo to faktor troška usporava.

Koji faktor troška da koristim?

Najmanje 10, a više ako tvoj server ostaje dovoljno brz. Izmeri na svom produkcionom hardveru: vreme prikazano ovde odražava JavaScript u tvom pregledaču, koji je obično sporiji od servera.

Da li su heševi $2a$, $2b$ i $2y$ zamenljivi?

Za lozinke kraće od 256 bajtova daju isti rezultat, a ovaj alat proverava sva tri. $2b$ je ispravio grešku prekoračenja dužine u OpenBSD implementaciji, a $2y$ je PHP naziv za ispravnu implementaciju.

Da li je bezbedno ovde upisati pravu lozinku?

Sve se izvršava lokalno i ništa se ne šalje niti čuva. Za prave naloge je ipak dobra praksa da testiraš sa probnom lozinkom, a ne sa onom koju koristiš.