Wszystkie artykuły

Bcrypt: dlaczego hasła haszuje się wolno, a nie szybko

Limit 72 bajtów w bcrypcie działa różnie w zależności od języka. Zwykłe litery łacińskie zajmują w UTF-8 1 bajt, ale polskie znaki diakrytyczne — ą, ć, ę, ł, ń, ó, ś, ź, ż — zajmują po 2 bajty każdy. Hasło pełne polskich znaków, na przykład "żółwipłynąłdorzeźbionejłąki", osiąga limit 72 bajtów przy znacznie mniejszej liczbie znaków niż to samo hasło zapisane bez ogonków i kropek.

Dlaczego szybkość szkodzi bezpieczeństwu haseł

Jeśli atakujący ukradnie bazę skrótów haseł, próbuje odzyskać oryginalne hasło metodą brute force. Przy szybkiej funkcji jak SHA-256 nowoczesny sprzęt sprawdza miliardy kombinacji na sekundę. Bcrypt celowo sprawia, że jedno haszowanie trwa około 100 milisekund, co czyni brute force o rzędy wielkości wolniejszym i droższym.

Czym jest cost factor

Parametr "cost" bcrypta określa liczbę wewnętrznych rund jako potęgę dwójki (2^cost, zwykle 10-12). Zwiększenie go o jeden podwaja czas haszowania — i podwaja też całkowity koszt ataku brute force dla atakującego.

Wbudowana sól

Bcrypt automatycznie generuje unikalną losową sól dla każdego hasła i osadza ją bezpośrednio w wyniku — nie trzeba niczego przechowywać osobno. Dwa identyczne hasła dają różne skróty, a wcześniej obliczone tabele (rainbow tables) dla popularnych haseł stają się bezużyteczne — każdy skrót trzeba atakować osobno.

Do czego to się przydaje

  • Prawidłowe przechowywanie haseł użytkowników w bazie danych aplikacji.
  • Zrozumienie, dlaczego SHA-256 lub MD5 to zły wybór do haszowania haseł.
  • Testowanie lub migracja systemu uwierzytelniania korzystającego z bcrypt.

Ukryty limit: 72 bajty, nie znaki

Bcrypt przetwarza tylko pierwsze 72 bajty hasła — wszystko dłuższe jest po cichu odrzucane, bez ostrzeżenia. Dla haseł bez polskich znaków to 72 znaki; ale przy haśle bogatym w ą, ę, ś czy ż realny limit w znakach jest zauważalnie niższy — warto to uwzględnić, ustalając maksymalną długość hasła w formularzu rejestracji.

Wypróbuj narzędzie