Utilia

Generator i weryfikator bcrypt

Generuj hash bcrypt z kosztem od 4 do 14, sprawdzaj hasło z istniejącym hashem i zobacz jego wersję, koszt, sól i skrót. Wszystko w przeglądarce.

Haszuj hasło

Sprawdź hasło z hashem

Jak zahaszować hasło za pomocą bcrypt

  1. W sekcji Haszuj hasło wpisz Hasło. Licznik pokazuje jego długość w bajtach UTF-8 i ostrzega, gdy przekroczy 72 bajty.
  2. Wybierz Współczynnik kosztu (4–14). Wiersz poniżej pokazuje liczbę rund, np. 10 → 2^10 = 1024 rundy.
  3. Kliknij Generuj hash. Pasek postępu śledzi obliczenia, a strona pozostaje w tym czasie responsywna. Po zakończeniu narzędzie pokazuje czas obliczeń i gotowy do skopiowania Hash bcrypt.
  4. Hash jest rozbity na części: Wersja, Koszt, Sól (22 znaki) i Skrót (31 znaków).

Aby sprawdzić hasło z hashem, wpisz hasło, wklej hash (właśnie wygenerowany wstawia się automatycznie) i kliknij Sprawdź hasło. Wynik powie, czy pasują do siebie. Zaznacz Ukryj hasła, aby zamaskować oba pola z hasłem.

Haszowanie działa w twojej przeglądarce dzięki bibliotece bcryptjs, wczytywanej dopiero wtedy, gdy jest potrzebna. Żadne hasło ani hash nie są nigdzie wysyłane.

Jak działa bcrypt

bcrypt (Provos i Mazières, 1999) to funkcja haszująca hasła oparta na szyfrze Blowfish. W przeciwieństwie do SHA-256 jest celowo wolna, a jej powolność można regulować: współczynnik kosztu jest potęgą dwójki, więc każde +1 podwaja pracę. Koszt 10 oznacza 1024 iteracje kosztownego przygotowania klucza, koszt 12 – 4096. Przy logowaniu użytkownika ta powolność ledwo ma znaczenie, ale łamanie siłowe skradzionej bazy danych staje się znacznie droższe.

Hash taki jak $2b$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy czyta się następująco:

  • $2b$: wersja. $2a$ i $2y$ (PHP) są zgodne i można je tu sprawdzić; $2x$ oznacza hashe ze starej, błędnej implementacji i jest odrzucany.
  • 10: współczynnik kosztu.
  • Kolejne 22 znaki: losowa 128-bitowa sól we własnym alfabecie Base64 bcrypta (./A-Za-z0-9).
  • Ostatnie 31 znaków: 184-bitowy wynik.

Ponieważ sól jest losowa i zapisana w hashu, dwukrotne zahaszowanie tego samego hasła daje dwa różne hashe, a oba weryfikują się poprawnie. Dlatego hasło sprawdza się funkcją weryfikującą, a nie przez porównanie hashy.

Wybór kosztu

Wybierz najwyższy koszt, na jaki stać twój serwer, przy zachowaniu szybkiego logowania – zwykle około ćwierć sekundy na hash. OWASP zaleca dla bcrypta koszt co najmniej 10. Przeglądarki wykonują bcrypt w JavaScripcie, co jest kilka razy wolniejsze niż natywna implementacja na serwerze: od kosztu 12 narzędzie ostrzega, że haszowanie może trwać od jednej do kilku sekund, a każdy kolejny stopień podwaja czas. Praca jest dzielona na krótkie fragmenty, więc strona się nie zawiesza.

W nowych systemach OWASP preferuje obecnie Argon2id; bcrypt pozostaje akceptowalny tam, gdzie Argon2id nie jest dostępny.

Limit 72 bajtów

bcrypt używa tylko pierwszych 72 bajtów hasła; wszystko dalej jest po cichu ignorowane. Bajty to nie znaki: polska litera z ogonkiem zajmuje w UTF-8 2 bajty, a emoji 4. Dwa długie hasła o tych samych pierwszych 72 bajtach dają ten sam hash. Licznik bajtów ostrzega, gdy hasło jest za długie. Niektóre systemy wstępnie haszują długie hasła (np. HMAC-SHA256, a potem Base64) przed bcryptem; jeśli tak robisz, nigdy nie przekazuj surowych binarnych skrótów, bo bajt zerowy w wielu implementacjach przedwcześnie kończy hasło.

Najczęściej zadawane pytania

Dlaczego to samo hasło daje za każdym razem inny hash?

Każdy hash dostaje nową losową sól, zapisaną w jego wnętrzu. Przycisk Sprawdź hasło odczytuje sól i koszt z hasha i oblicza go ponownie, więc każda wersja przechodzi weryfikację.

Czy hash bcrypt można odszyfrować?

Nie. bcrypt jest funkcją jednokierunkową. Jedynym sposobem odzyskania hasła jest zgadywanie i haszowanie każdej próby – a właśnie to spowalnia współczynnik kosztu.

Jakiego współczynnika kosztu używać?

Co najmniej 10, a więcej, jeśli serwer pozostaje wystarczająco szybki. Zmierz czas na sprzęcie produkcyjnym: czas pokazany tutaj dotyczy JavaScriptu w twojej przeglądarce, zwykle wolniejszego niż serwer.

Czy hashe $2a$, $2b$ i $2y$ są wymienne?

Dla haseł krótszych niż 256 bajtów dają ten sam wynik, a narzędzie sprawdza wszystkie trzy. $2b$ naprawił błąd przepełnienia długości w implementacji OpenBSD, a $2y$ to nazwa używana w PHP dla poprawnej implementacji.

Czy mogę tu bezpiecznie wpisać prawdziwe hasło?

Wszystko działa lokalnie, nic nie jest wysyłane ani zapisywane. Mimo to przy prawdziwych kontach dobrą praktyką jest testowanie na przykładowym haśle, a nie na tym, którego używasz.