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.