Generator haseł scrypt
Generuj hash hasła za pomocą scrypt, odpornej na ataki pamięciowe funkcji wyprowadzania klucza. Ustaw sól, koszt (N), rozmiar bloku (r), stopień równoległości (p) i długość klucza, a otrzymasz hash w formatach PHC, szesnastkowym i Base64. Działa w przeglądarce.
Wejście
Wyjście
Instrukcja
Czym jest scrypt?
scrypt to funkcja haszująca hasła, czyli funkcja wyprowadzania klucza, zaprojektowana przez Colina Percivala w 2009 roku i opublikowana jako RFC 7914. Podobnie jak bcrypt i Argon2, celowo działa wolno, dzięki czemu każda próba odgadnięcia hasła kosztuje atakującego czas. Jest też funkcją wymagającą dużej ilości pamięci: każdy hash wypełnia duży blok pamięci, a następnie odczytuje go w nieprzewidywalnej kolejności, co znacznie podnosi koszt łamania haseł przy użyciu GPU i specjalizowanych układów. scrypt jest używany do przechowywania haseł w wielu frameworkach internetowych, bibliotekach standardowych Node.js, Pythona i Go oraz w portfelach kryptowalut, takich jak magazyny kluczy Ethereum.
Opis narzędzia
To narzędzie oblicza hash hasła za pomocą scrypt w przeglądarce. Zaczyna od losowej soli i ustawień zalecanych przez OWASP do przechowywania haseł. Możesz zmienić sól, koszt (N), rozmiar bloku (r), równoległość (p) i długość klucza. Hash jest dostępny jako ciąg PHC dla bibliotek do obsługi haseł, a także w formatach hex i Base64 dla kodu, który osobno przechowuje sól i parametry.
Funkcje
- Oblicza hash hasła za pomocą scrypt zgodnie z RFC 7914
- Tworzy losową 16-bajtową sól i udostępnia przycisk do wygenerowania nowej
- Przyjmuje własną sól, aby odtworzyć hash utworzony w innym miejscu
- Umożliwia ustawienie kosztu (N) od 2⁴ do 2²⁰, rozmiaru bloku (r), równoległości (p) i długości klucza
- Udostępnia hash jako ciąg PHC oraz w formatach hex i Base64
- Pokazuje postęp obliczania hashów, które wymagają dużo czasu, i ostrzega, gdy ustawienia wymagają ponad 1 GiB pamięci
- Działa w przeglądarce, więc hasło nigdy nie opuszcza urządzenia
Parametry
| Parametr | Domyślnie | Działanie |
|---|---|---|
| Koszt (N) | 131072 (2¹⁷) | Liczba bloków pamięci. Podwojenie tej wartości podwaja czas i zużycie pamięci. |
| Rozmiar bloku (r) | 8 | Rozmiar każdego bloku: 128 × r bajtów. Wpływa również na czas i zużycie pamięci. |
| Równoległość (p) | 1 | Liczba niezależnych przebiegów. Zwiększa czas, ale nie zużycie pamięci. |
| Długość klucza | 32 bajty | Długość hasha. |
Wymagana ilość pamięci wynosi 128 × N × r bajtów, czyli przy ustawieniach domyślnych 128 MiB.
Formaty wyjściowe
Ciąg PHC zawiera wszystkie informacje potrzebne do późniejszego sprawdzenia hasła: algorytm, parametry, sól i hash. Sól oraz hash są zapisane w Base64 bez dopełnienia:
$scrypt$ln=17,r=8,p=1$<salt>$<hash>ln to logarytm o podstawie 2 z N, więc ln=17 oznacza N = 131072. Ten format jest odczytywany i zapisywany przez passlib dla Pythona, bibliotekę scrypt dla Rusta oraz pakiet @phc/scrypt dla Node.js.
Pola hex i Base64 zawierają wyłącznie hash, taki jak zwracany przez crypto.scrypt w Node.js, hashlib.scrypt w Pythonie i scrypt.Key w Go. Zapisz obok niego sól i parametry.
Jak to działa
Pole soli jest odczytywane jako tekst i kodowane jako UTF-8, tak samo jak w przypadku przekazania soli w postaci ciągu znaków do crypto.scrypt w Node.js. Losowa sól składa się z 16 losowych bajtów zapisanych jako 32 znaki hex; to właśnie te 32 znaki są haszowane. Hasło również jest kodowane jako UTF-8. Hash jest obliczany w wątku działającym w tle, dzięki czemu strona pozostaje responsywna. Obliczenia rozpoczynają się ponownie po zmianie dowolnego wejścia.
Wskazówki
- Używaj nowej, losowej soli dla każdego hasła. To samo hasło z tą samą solą zawsze daje ten sam hash.
- OWASP zaleca do przechowywania haseł co najmniej N = 2¹⁷, r = 8, p = 1. Zwiększaj N tak bardzo, jak pozwalają na to zasoby serwera przy każdym logowaniu.
- Node.js domyślnie ogranicza scrypt do 32 MiB pamięci. Gdy używasz N = 2¹⁷ lub większego oraz r = 8, przekaż do
crypto.scryptwyższą wartośćmaxmem. - Aby sprawdzić hash z innego systemu, podaj to samo hasło, sól i parametry, a następnie porównaj wyniki.