Utilia

Bcrypt generátor és ellenőrző

Generálj bcrypt hasht 4 és 14 közötti költségtényezővel, ellenőrizz jelszót meglévő hash alapján, és nézd meg a verziót, a költséget, a sót és a hasht.

Jelszó hashelése

Jelszó ellenőrzése hash alapján

Hogyan hasheld a jelszót bcrypttel

  1. A Jelszó hashelése részben írd be a Jelszó mezőbe a jelszót. Egy számláló mutatja a hosszát UTF-8 bájtokban, és figyelmeztet, ha átlépi a 72 bájtot.
  2. Válaszd ki a Költségtényező (4–14) értékét. Az alatta lévő sor megmutatja a körök számát, például 10 → 2^10 = 1 024 kör.
  3. Kattints a Hash generálása gombra. Egy folyamatjelző követi a munkát, és az oldal közben használható marad. Amikor kész, az eszköz megmutatja az eltelt időt és a másolásra kész Bcrypt hash értéket.
  4. A hash részeire bontva is látszik: Verzió, Költség, Só (22 karakter) és Hash (31 karakter).

Ha jelszót szeretnél ellenőrizni hash alapján, írd be a jelszót, illeszd be a hasht (az éppen generált automatikusan kitöltődik), és kattints a Jelszó ellenőrzése gombra. Az eredmény megmondja, hogy megegyeznek-e. A Jelszavak elrejtése bejelölésével mindkét jelszómező tartalmát elfedheted.

A hashelés a böngésződben fut a bcryptjs könyvtárral, amelyet csak az első használatkor töltünk be. Sem jelszót, sem hasht nem küldünk el sehová.

Hogyan működik a bcrypt

A bcrypt (Provos és Mazières, 1999) a Blowfish titkosításra épülő jelszó-hashelő függvény. A SHA-256-tól eltérően szándékosan lassú, és a lassúsága szabályozható: a költségtényező kettő hatványa, ezért minden +1 megkétszerezi a munkát. A 10-es költség a költséges kulcsbeállítás 1 024 iterációját jelenti, a 12-es költség 4 096-ot. Ez a lassúság egy felhasználó bejelentkezésekor alig számít, egy ellopott adatbázis nyers erővel való feltörését viszont jóval költségesebbé teszi.

Egy ilyen hash, mint a $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy, így olvasható:

  • $2b$: a verzió. A $2a$ és a $2y$ (PHP) kompatibilis, és itt ellenőrizhető; a $2x$ egy régi, hibás megvalósításból származó hasheket jelöl, ezért elutasítjuk.
  • 10: a költségtényező.
  • A következő 22 karakter: egy véletlen 128 bites só a bcrypt saját Base64-ábécéjével (./A-Za-z0-9).
  • Az utolsó 31 karakter: a 184 bites eredmény.

Mivel a só véletlen, és a hashben tárolódik, ugyanannak a jelszónak a kétszeri hashelése két különböző hasht ad, és mindkettő helyesen ellenőrizhető. Ezért kell a jelszót ellenőrző függvénnyel vizsgálni, nem pedig a hasheket összehasonlítani.

A költség megválasztása

Válaszd a lehető legnagyobb költséget, amelyet a szervered még elbír úgy, hogy a bejelentkezés gyors marad, jellemzően hashenként nagyjából negyed másodpercet. Az OWASP legalább 10-es költséget javasol a bcrypthez. A böngészők a bcryptet JavaScriptben futtatják, ami többszörösen lassabb egy natív szerveroldali megvalósításnál: a 12-es költségtől az eszköz figyelmeztet, hogy a hashelés egy-több másodpercig is tarthat, és minden további lépés megduplázza az időt. A munka rövid szeletekre van osztva, ezért az oldal nem fagy le.

Új rendszerekhez az OWASP ma már az Argon2id-t részesíti előnyben, a bcrypt pedig ott marad elfogadható, ahol az Argon2id nem érhető el.

A 72 bájtos korlát

A bcrypt a jelszónak csak az első 72 bájtját használja, a többit csendben figyelmen kívül hagyja. A bájt nem karakter: egy ékezetes betű UTF-8-ban 2 bájt, egy emoji 4 bájt. Két hosszú jelszó, amelynek az első 72 bájtja azonos, ugyanazt a hasht adja. A bájtszámláló figyelmeztet, ha a jelszó túl hosszú. Egyes rendszerek a hosszú jelszavakat a bcrypt előtt előhashelik (például HMAC-SHA256-tal, majd Base64-gyel); ha ezt teszed, soha ne add át a nyers bináris kivonatot, mert egy nullbájt sok megvalósításban idő előtt lezárná a jelszót.

Gyakori kérdések

Miért ad ugyanaz a jelszó minden alkalommal más hasht?

Minden hash új véletlen sót kap, és ez a hash belsejében tárolódik. A Jelszó ellenőrzése gomb a hashből kiolvassa a sót és a költséget, majd újraszámolja az értéket, így minden verzió ellenőrizhető.

Visszafejthető a bcrypt hash?

Nem. A bcrypt egyirányú függvény. A jelszót csak úgy lehet visszanyerni, ha kitalálod, és minden tippet lehasheled, amit a költségtényező éppen lassúvá tesz.

Milyen költségtényezőt használjak?

Legalább 10-et, és többet, ha a szervered így is elég gyors marad. Mérj a saját éles hardveredén: az itt látható idő a böngésződben futó JavaScriptet tükrözi, amely általában lassabb egy szervernél.

Felcserélhetők a $2a$, $2b$ és $2y$ hashek?

256 bájtnál rövidebb jelszavaknál ugyanazt az eredményt adják, és ez az eszköz mindhármat ellenőrzi. A $2b$ az OpenBSD megvalósításának egy hosszátfordulási hibáját javította, a $2y$ pedig a PHP neve egy helyes megvalósításra.

Biztonságos valódi jelszót beírni ide?

Minden helyben fut, semmit nem küldünk el és nem tárolunk. Valódi fiókoknál azért jó gyakorlat egy mintajelszóval tesztelni, nem pedig olyannal, amelyet használsz.