Generator i weryfikator skrótów haseł

Haszuj i weryfikuj hasła za pomocą bcrypt, scrypt, Argon2id i PBKDF2 w całości w przeglądarce — generuj ciągi w formacie PHC, sprawdzaj kandydata hasła względem istniejącego skrótu i przeglądaj parametry ukryte w nim. Nic nie jest wysyłane.
Tylko dla haseł testowych. Prawdziwe hasła użytkowników nigdy nie powinny być wklejane na żadną stronę internetową. To narzędzie działa w całości w przeglądarce — ciągi nigdy nie opuszczają karty — ale prawdziwy wyciek zaczyna się od jednego wklejenia.
koszt bcrypt (2^koszt rund)
wariant bcrypt wariant zmienia tylko prefiks; sam skrót jest identyczny
scrypt N (koszt CPU)
scrypt r / p r =   p = rozmiar bloku 128·r bajtów; pamięć = 128·N·r bajtów (N=214, r=8 → 16 MiB)
Argon2id m (pamięć)
Argon2id t / p t =   p = t = przebiegi; p = równoległość (pasy)
PRF PBKDF2
Iteracje PBKDF2  OWASP 2023: 600 000 dla HMAC-SHA-256 (1 300 000 dla SHA-1, 210 000 dla SHA-384/512)
Długość wyjścia (bajty)  wynik bcrypt ma stałe 23 bajty (31 znaków base64 bcrypt)
AlgorytmParametryPamięćDługość wyjściaCzas (ta przeglądarka)
bcryptkoszt 124 KiB23 bajty-
scryptN=214, r=8, p=116 MiB32 bajty-
Argon2idm=19 MiB, t=2, p=119 MiB32 bajty-
PBKDF2HMAC-SHA-256, 600 000 iteracji~032 bajty-
Ściągawka parametrów (minima OWASP Password Storage Cheat Sheet, 2023)
AlgorytmMinimumUwagi
Argon2idm = 19 MiB (19 456 KiB), t = 2, p = 1zalecany; wymagający pamięci
scryptN = 214, r = 8, p = 1wymagający pamięci (16 MiB przy minimum)
bcryptkoszt = 10tylko czynnik pracy; limit hasła 72 bajty
PBKDF2-HMAC-SHA256600 000 iteracjitylko twardy iteracyjnie — przyjazny GPU, ostatni wybór
Domyślne ustawienia tej strony są na poziomie lub powyżej każdego minimum. Do produkcji wybierz najpierw Argon2id, scrypt lub bcrypt, jeśli jest niedostępny, a PBKDF2 tylko ze względów zgodności z FIPS.
Współpraca z PHP — password_hash($pw, PASSWORD_BCRYPT) zwraca $2y$10$...: wklej go do Weryfikacji z kandydackim hasłem, a ta strona odpowie dokładnie tak, jak zrobiłoby password_verify(). Wynik PASSWORD_ARGON2ID ($argon2id$v=19$m=65536,t=4,p=1$...) także się weryfikuje. Ciągi PHC z passlib, django-argon2 i opakowania crypto.scrypt też się parsują.
Autotest
Ponownie uruchamia silnik strony na publicznych wektorach: zestaw testów crypt_blowfish dla bcrypt, ciągi scrypt i Argon2id wygenerowane przez node/OpenSSL, wektory PBKDF2 z RFC 6070 oraz publiczny zestaw SHA-256, a także przejścia generuj-potem-weryfikuj we wszystkich algorytmach i testy negatywne (złe hasło musi się nie powieść, źle sformułowane ciągi muszą być odrzucone). Nic nie jest nigdzie wysyłane.
Haszowanie haseł wyjaśnione od podstaw
W jednym zdaniu: skrót hasła jest celowo wolny (i najlepiej wymagający pamięci), by kradzież bazy nie pozwoliła atakującemu na miliardy zgadywań na sekundę — przeciwny cel niż w przypadku szybkiego skrótu jak SHA-256, który zbudowano z myślą o szybkości.
Dlaczego nie po prostu SHA-256 hasła?

SHA-256 na nowoczesnym GPU wykonuje miliardy zgadywań na sekundę. Hasło 8-znakowe ma znacznie poniżej 1013 kombinacji — godziny czasu GPU, minuty na dużej farmie. Funkcje haszowania haseł (KDF) walczą z tym za pomocą parametrów kosztu: bcrypt powtarza swój rdzeń 2koszt razy, PBKDF2 iteruje HMAC setki tysięcy razy, a scrypt i Argon2id dodatkowo wymagają megabajtów pamięci na zgadnięcie, więc GPU (szybkie, ale ubogie w pamięć na rdzeń) tracą przewagę. Sól — losowa, przechowywana jawnie w ciągu skrótu — zatrzymuje wstępnie obliczone tablice tęczowe i wymusza świeże obliczenie każdego zgadnięcia dla każdego użytkownika.

Cztery algorytmy na tej stronie
AlgorytmRokTwardośćFormat podpisuUważaj na
bcrypt1999CPU (2koszt przygotowań klucza)$2b$12$ + 22-znakowa sól + 31-znakowy skrótlimit hasła 72 bajty (wszystko powyżej 72 jest po cichu ignorowane); bajt NUL kończy hasło w oryginalnej implementacji w C
PBKDF22000 (RFC 2898/8018)CPU (iteracje)$pbkdf2-sha256$i=600000$ + sól + skrót (styl passlib)brak kosztu pamięci — GPU i ASIC to kochają; tylko liczba iteracji jest regulowana
scrypt2009 (RFC 7914)CPU + pamięć (128·N·r bajtów)$scrypt$ln=14,r=8,p=1$ + sól + skrótN musi być potęgą dwójki; pamięć rośnie liniowo z r
Argon2id2015 (zwycięzca PHC, RFC 9106)CPU + pamięć (m KiB, t przebiegów)$argon2id$v=19$m=19456,t=2,p=1$ + sól + skrótArgon2i (niezależny od danych) kontra Argon2d (zależny od danych) kontra Argon2id (hybryda) — zawsze wybieraj id, chyba że wiadomo, dlaczego nie
Odporność na pamięć a odporność na obliczenia

GPU ma tysiące rdzeni, ale każdy rdzeń ma dostęp do niewielkiej ilości szybkiej pamięci. KDF, który wymaga 19 MiB roboczego zbioru na jedno zgadnięcie, ogranicza atakującego do tylu równoległych zgadywań, ile ma 19-MiB porcji pamięci — dlatego Argon2id przy 19 MiB może być w praktyce silniejszy niż bcrypt przy koszcie 15, mimo krótszego czasu na laptopie. PBKDF2 nie ma na to odpowiedzi: jego jedyną regulacją jest liczba iteracji, a krzem skaluje to liniowo.

Czytanie ciągu PHC

Format modularnych szyfrów / PHC jest samoopisowy: w $argon2id$v=19$m=19456,t=2,p=1$ICEiIyQlJicoKSorLC0uLw$WTGpK4hf... pola to algorytm, wersja, parametry (m = pamięć w KiB, t = przebiegi, p = pasy), sól w base64, skrót w base64. bcrypt jest starszy niż standard i używa własnej zwartej postaci: wariant $2b$, 12 koszt, a potem sól i skrót w niestandardowym alfabecie base64 bcrypt (./A-Za-z0-9). Weryfikacja na tej stronie przyjmuje wszystkie te formaty i pokazuje sparsowane pola — wklej dowolny znaleziony skrót i zobacz, na co się rozkłada.

Typowe błędy
  • Szybki skrót dla haseł. Kolumny z hasłami w MD5/SHA-1/SHA-256 padają przed zwykłymi kartami GPU przy miliardach zgadywań na sekundę. Do plików i danych używaj Generatora skrótów; do haseł używaj algorytmów z tej strony.
  • Współdzielona sól. Jedna sól dla wszystkich użytkowników oznacza, że równe hasła dają równe skróty, a tablice tęczowe wracają. Każdy skrót tutaj dostaje świeżą, losową 16-bajtową sól.
  • Ignorowanie 72 bajtów bcrypt. "a"*100 i "a"*72 dają identyczne skróty — ogon jest odrzucany. Ta strona ostrzega w polu wejściowym, gdy hasło przekracza 72 bajty. Argon2 nie ma takiego limitu.
  • Porównywanie skrótów przez == we własnym kodzie. Weryfikacja musi działać w stałym czasie; silnik strony robi to wewnętrznie (przelicza i porównuje zapisane bajty), ale jeśli kopiuje się to podejście, należy użyć porównania w stałym czasie.
  • Strojenie parametrów na szybkim komputerze deweloperskim. Celuj w ok. 250–500 ms haszowania na mediańskim sprzęcie produkcyjnych użytkowników, a nie na stacji roboczej dewelopera. Przycisk Porównanie pokazuje, jak ta przeglądarka faktycznie to odczuwa.
  • Ponowne haszowanie przy każdym sprawdzeniu logowania. Najpierw weryfikuj; ponownie haszuj (np. by podnieść koszt) dopiero po udanej weryfikacji i zapisz nowy ciąg. Funkcja PHP password_needs_rehash() istnieje właśnie w tym celu.
FAQ

Który wybrać? Argon2id z co najmniej minimami OWASP. Jeśli środowisko go nie oferuje: scrypt, potem bcrypt (koszt taki, by haszowanie trwało ≥250 ms). PBKDF2 tylko tam, gdzie wymaga tego certyfikacja.

Dlaczego losowa sól jest pokazana w ciągu wyniku? Sól nie jest sekretem — jest celowo przechowywana jawnie w ciągu PHC, więc weryfikacja potrzebuje tylko ciągu i kandydackiego hasła. Jej zadaniem jest unikalność, a nie tajność.

Czy wariant ($2a$ / $2b$ / $2y$) ma znaczenie? Dla haseł ASCII dają identyczne skróty; $2a$ to pierwotna wersja z lat 90., $2b$ naprawiło rzadki błąd rozszerzania znaku (2014), a $2y$ to znacznik PHP, że poprawka jest obecna. Weryfikacja przyjmuje wszystkie trzy.

Jak długo powinien trwać skrót? Mniej więcej 250–500 ms na logowanie na sprzęcie serwerowym. Poniżej 100 ms łamanie offline jest tanie; powyżej 1 s użytkownicy narzekają, zanim poprawi się bezpieczeństwo.

Czy mogę zweryfikować skrót utworzony gdzie indziej? Tak — wklej go i podaj kandydackie hasło. Sprawdzone formaty: PHP password_hash (bcrypt $2y$ i Argon2id), Python passlib, hasher argon2 z django oraz format ciągu scrypt używany przez narzędzie scrypt Tarsnap.

Co robi przycisk „porównania”? Haszuje bieżące hasło raz każdym algorytmem z parametrami domyślnymi strony i raportuje czas w tej przeglądarce — wyczucie różnic kosztów, a nie rygorystyczny pomiar.