Utilia

Generator in preverjevalnik bcrypt

Ustvari zgoščeno vrednost bcrypt s faktorjem 4–14, preveri geslo glede na obstoječo vrednost in oglej si različico, faktor, sol in zgostitev.

Zgosti geslo

Preveri geslo glede na zgoščeno vrednost

Kako zgostiti geslo z bcrypt

  1. Pod Zgosti geslo vnesi Geslo. Števec prikaže njegovo dolžino v bajtih UTF-8 in te opozori, ko preseže 72 bajtov.
  2. Izberi Faktor zahtevnosti (4–14). Vrstica pod njim prikaže število krogov, na primer 10 → 2^10 = 1 024 krogov.
  3. Klikni Ustvari zgoščeno vrednost. Vrstica napredka spremlja delo, stran pa med njim ostane uporabna. Ko je končano, orodje prikaže porabljen čas in Zgoščena vrednost bcrypt, pripravljeno za kopiranje.
  4. Zgoščena vrednost je razdeljena na dele: Različica, Faktor, Sol (22 znakov) in Zgostitev (31 znakov).

Če želiš preveriti geslo glede na zgoščeno vrednost, vnesi geslo, prilepi zgoščeno vrednost (tista, ki si jo pravkar ustvaril, se izpolni samodejno) in klikni Preveri geslo. Rezultat pove, ali se ujemata. S potrditvijo Skrij gesla zakriješ obe polji z geslom.

Zgoščevanje poteka v tvojem brskalniku s knjižnico bcryptjs, ki se naloži šele, ko jo prvič potrebuješ. Nobeno geslo ali zgoščena vrednost se ne pošlje nikamor.

Kako deluje bcrypt

bcrypt (Provos in Mazières, 1999) je funkcija za zgoščevanje gesel, zgrajena na šifri Blowfish. Za razliko od SHA-256 je namerno počasna, njena počasnost pa je nastavljiva: faktor zahtevnosti je potenca števila dve, zato vsak +1 podvoji delo. Faktor 10 pomeni 1 024 ponovitev drage priprave ključa, faktor 12 pa 4 096. Ta počasnost komaj vpliva na prijavo uporabnika, močno pa podraži poskušanje vseh možnosti na ukradeni bazi.

Zgoščena vrednost, kot je $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy, se bere takole:

  • $2b$: različica. $2a$ in $2y$ (PHP) sta združljivi in ju je mogoče tu preveriti; $2x$ označuje vrednosti iz stare izvedbe z napako in je zavrnjen.
  • 10: faktor zahtevnosti.
  • Naslednjih 22 znakov: naključna 128-bitna sol v bcryptovi lastni abecedi Base64 (./A-Za-z0-9).
  • Zadnjih 31 znakov: 184-bitni rezultat.

Ker je sol naključna in shranjena v zgoščeni vrednosti, dvakratno zgoščevanje istega gesla da dve različni vrednosti, obe pa se pravilno preverita. Zato geslo preverjaš s funkcijo za preverjanje, ne s primerjavo zgoščenih vrednosti.

Izbira faktorja zahtevnosti

Izberi najvišji faktor, ki ga tvoj strežnik zmore, pri tem pa naj prijave ostanejo hitre, običajno okoli četrt sekunde na zgostitev. OWASP priporoča najmanjši faktor 10 za bcrypt. Brskalniki poganjajo bcrypt v JavaScriptu, kar je nekajkrat počasneje kot izvorna izvedba na strežniku: od faktorja 12 naprej orodje opozori, da lahko zgoščevanje traja od ene do več sekund, vsak dodaten korak pa čas podvoji. Delo je razdeljeno na kratke odseke, zato se stran ne zamrzne.

Za nove sisteme OWASP zdaj daje prednost Argon2id, bcrypt pa je še vedno sprejemljiv, kjer Argon2id ni na voljo.

Omejitev 72 bajtov

bcrypt uporabi samo prvih 72 bajtov gesla; vse za tem se tiho prezre. Bajti niso znaki: črka s strešico v UTF-8 zavzame 2 bajta, emoji pa 4. Dve dolgi gesli, ki imata enakih prvih 72 bajtov, dasta enako zgoščeno vrednost. Števec bajtov te opozori, ko je geslo predolgo. Nekateri sistemi dolga gesla pred bcryptom predhodno zgostijo (na primer s HMAC-SHA256 in nato Base64). Če to počneš, nikoli ne podajaj neobdelanih dvojiških zgostitev, ker bi ničelni bajt v številnih izvedbah predčasno končal geslo.

Pogosta vprašanja

Zakaj isto geslo vsakič da drugačno zgoščeno vrednost?

Vsaka zgostitev dobi novo naključno sol, ki je shranjena v sami vrednosti. Gumb Preveri geslo prebere sol in faktor iz zgoščene vrednosti ter jo znova izračuna, zato se preveri vsaka različica.

Ali je zgoščeno vrednost bcrypt mogoče dešifrirati?

Ne. bcrypt je enosmerna funkcija. Edini način za obnovitev gesla je ugibanje in zgoščevanje vsakega ugiba, kar faktor zahtevnosti ravno upočasni.

Kateri faktor zahtevnosti naj uporabim?

Vsaj 10, več pa, če je tvoj strežnik še dovolj hiter. Meri na svoji produkcijski strojni opremi: čas, prikazan tu, odraža JavaScript v tvojem brskalniku, ki je običajno počasnejši od strežnika.

Ali so zgoščene vrednosti $2a$, $2b$ in $2y$ zamenljive?

Za gesla, krajša od 256 bajtov, dajo enak rezultat, orodje pa preveri vse tri. $2b$ je odpravil napako prelivanja dolžine v izvedbi OpenBSD, $2y$ pa je ime v PHP za pravilno izvedbo.

Ali je varno tu vnesti pravo geslo?

Vse poteka lokalno in nič se ne pošlje ali shrani. Za prave račune je vseeno dobra navada preizkušati z vzorčnim geslom, ne s tistim, ki ga uporabljaš.