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.scrypt wyższą wartość maxmem.
  • Aby sprawdzić hash z innego systemu, podaj to samo hasło, sól i parametry, a następnie porównaj wyniki.