Utilia

Bcrypt generator i provjera

Generiraj bcrypt hash s faktorom troška od 4 do 14, provjeri lozinku prema postojećem hashu i pogledaj njegovu verziju, trošak, sol i sažetak.

Sažmi lozinku

Provjeri lozinku prema hashu

Kako sažeti lozinku bcryptom

  1. Pod Sažmi lozinku upiši Lozinka. Brojač prikazuje njezinu duljinu u UTF-8 bajtovima i upozorava kad pređe 72 bajta.
  2. Odaberi Faktor troška (4–14). Redak ispod prikazuje broj krugova, na primjer 10 → 2^10 = 1024 kruga.
  3. Klikni Generiraj hash. Traka napretka prati rad, a stranica ostaje upotrebljiva dok se izvodi. Kad završi, alat prikazuje utrošeno vrijeme i Bcrypt hash, spreman za kopiranje.
  4. Hash je podijeljen na dijelove: Verzija, Trošak, Sol (22 znaka) i Hash (31 znak).

Da provjeriš lozinku prema hashu, upiši lozinku, zalijepi hash (onaj koji si upravo generirao upisuje se automatski) i klikni Provjeri lozinku. Rezultat kaže podudaraju li se. Označi Sakrij lozinke da zamaskiraš oba polja za lozinku.

Sažimanje se izvodi u tvom pregledniku pomoću biblioteke bcryptjs, koja se učitava tek kad je prvi put zatrebaš. Nijedna lozinka ni hash ne šalju se nikamo.

Kako bcrypt radi

bcrypt (Provos i Mazières, 1999.) funkcija je za sažimanje lozinki izgrađena na šifri Blowfish. Za razliku od SHA-256, namjerno je spor, a njegova se sporost može podešavati: faktor troška je potencija broja dva, pa svaki +1 udvostručuje posao. Trošak 10 znači 1024 ponavljanja skupe pripreme ključa, a trošak 12 znači 4096. Ta sporost jedva se primijeti kad se korisnik prijavljuje, ali brute-force napad na ukradenu bazu čini znatno skupljim.

Hash poput $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy čita se ovako:

  • $2b$: verzija. $2a$ i $2y$ (PHP) kompatibilne su i ovdje se mogu provjeriti, a $2x$ označava hasheve iz stare neispravne implementacije i odbija se.
  • 10: faktor troška.
  • Sljedećih 22 znaka: nasumična 128-bitna sol, u bcryptovoj vlastitoj Base64 abecedi (./A-Za-z0-9).
  • Posljednjih 31 znak: 184-bitni rezultat.

Budući da je sol nasumična i pohranjena u hashu, sažimanje iste lozinke dvaput daje dva različita hasha, a oba se ispravno provjeravaju. Zato se lozinka provjerava funkcijom za provjeru, a ne uspoređivanjem hasheva.

Odabir troška

Odaberi najviši trošak koji tvoj poslužitelj može podnijeti, a da prijave ostanu brze, obično oko četvrtine sekunde po hashu. OWASP preporučuje najmanji trošak 10 za bcrypt. Preglednici izvode bcrypt u JavaScriptu, koji je nekoliko puta sporiji od izvorne implementacije na poslužitelju: od troška 12 alat upozorava da sažimanje može trajati od jedne do nekoliko sekundi, a svaki dodatni korak udvostručuje vrijeme. Posao je podijeljen na kratke odsječke pa se stranica ne zamrzava.

Za nove sustave OWASP sada preferira Argon2id, a bcrypt ostaje prihvatljiv ondje gdje Argon2id nije dostupan.

Ograničenje od 72 bajta

bcrypt koristi samo prvih 72 bajta lozinke, a sve nakon toga tiho se zanemaruje. Bajtovi nisu znakovi: slovo s dijakritikom zauzima 2 bajta u UTF-8, a emotikon 4. Dvije duge lozinke koje dijele prvih 72 bajta daju isti hash. Brojač bajtova upozorava kad je lozinka predugačka. Neki sustavi prije bcrypta unaprijed sažimaju duge lozinke (primjerice HMAC-SHA256, pa Base64). Ako to radiš, nikada ne prosljeđuj sirove binarne sažetke, jer bi nulti bajt u mnogim implementacijama prerano završio lozinku.

Česta pitanja

Zašto ista lozinka svaki put daje drukčiji hash?

Svaki hash dobiva novu nasumičnu sol, koja je pohranjena unutar hasha. Gumb Provjeri lozinku čita sol i trošak iz hasha i ponovno ga izračunava, pa se svaka verzija ispravno provjerava.

Može li se bcrypt hash dešifrirati?

Ne. bcrypt je jednosmjerna funkcija. Jedini način da se lozinka otkrije jest pogađanje i sažimanje svakog pokušaja, a upravo to faktor troška čini sporim.

Koji faktor troška trebam koristiti?

Najmanje 10, a više ako tvoj poslužitelj ostaje dovoljno brz. Mjeri na svom produkcijskom hardveru: vrijeme prikazano ovdje odražava JavaScript u tvom pregledniku, koji je obično sporiji od poslužitelja.

Jesu li hashevi $2a$, $2b$ i $2y$ zamjenjivi?

Za lozinke kraće od 256 bajtova daju isti rezultat, a ovaj alat provjerava sva tri. $2b$ je ispravio grešku prelijevanja duljine u OpenBSD implementaciji, a $2y$ je PHP-ov naziv za ispravnu implementaciju.

Je li sigurno ovdje upisati pravu lozinku?

Sve se izvodi lokalno i ništa se ne šalje niti sprema. Za stvarne račune ipak je dobra praksa testirati s probnom lozinkom, a ne s onom koju koristiš.