scrypt

Wprowadzenie

scrypt (funkcja wyprowadzania klucza) — to funkcja wyprowadzania klucza oparta na haśle (Password-Based Key Derivation Function, PBKDF), zaprojektowana w celu zwiększenia bezpieczeństwa przechowywania haseł i kluczy kryptograficznych. Jej głównym celem jest uczynienie ataków typu brute-force oraz ataków z użyciem wyspecjalizowanego sprzętu (takiego jak układy ASIC) nieekonomicznymi i czasochłonnymi, poprzez zwiększenie wymagań zarówno obliczeniowych, jak i pamięciowych. Algorytm został stworzony przez Colina Percivala w 2009 roku. Został on zaprojektowany w odpowiedzi na ewoluujące zagrożenia w dziedzinie bezpieczeństwa cyfrowego, gdzie tradycyjne funkcje haszujące stawały się podatne na ataki z wykorzystaniem potężnych kart graficznych (GPU) i dedykowanego sprzętu. Scrypt wyróżnia się tym, że celowo wymaga dużej ilości pamięci operacyjnej, co utrudnia równoległe przeprowadzanie wielu prób zgadywania hasła na masową skalę.

Jak działają scrypt?

Działanie scrypt opiera się na strategii celowego zwiększania zapotrzebowania na zasoby systemowe, co czyni go odpornym na ataki. Kluczową cechą jest jego pamięciożerność, czyli właściwość wymagania dużej ilości pamięci RAM w celu wykonania obliczeń. To sprawia, że tworzenie wyspecjalizowanych układów ASIC, które zazwyczaj mają ograniczoną ilość pamięci, staje się bardzo kosztowne i nieefektywne. Algorytm używa kilku konfigurowalnych parametrów: N (czynnik kosztu CPU/pamięci), r (czynnik blokowy) i p (czynnik równoległości). Parametr N kontroluje liczbę iteracji, a także ilość pamięci, jaką algorytm zużywa. Im wyższe N, tym więcej czasu i pamięci jest potrzebne. Parametry r i p zwiększają koszt obliczeniowy w bardziej złożony sposób, wpływając na liczbę operacji odczytu i zapisu do pamięci. Dzięki tym parametrom administratorzy mogą dostosować poziom trudności haszowania do dostępnych zasobów i wymaganego poziomu bezpieczeństwa, balansując między wydajnością a odpornością na ataki. Proces haszowania z użyciem scrypt rozpoczyna się od wygenerowania pseudo-losowej sekwencji bajtów (soli), która jest unikalna dla każdego hasła. Następnie hasło i sól są wielokrotnie poddawane transformacjom, gdzie na każdym kroku generowane są duże bloki danych, które muszą być przechowywane w pamięci RAM. W dalszych iteracjach algorytm losowo odczytuje i modyfikuje te bloki, co jeszcze bardziej zwiększa zapotrzebowanie na pamięć i utrudnia równoległe obliczenia.

Główne zalety i charakterystyka

Główną zaletą scrypt jest jego wysoka odporność na ataki brute-force, zwłaszcza te przeprowadzane za pomocą wyspecjalizowanego sprzętu, takiego jak karty graficzne (GPU) czy układy ASIC. W przeciwieństwie do starszych funkcji, które są jedynie czasochłonne dla procesorów (CPU-hard), scrypt jest również pamięciożerny (memory-hard). To oznacza, że oprócz dużej liczby operacji wymaga również znaczącej ilości pamięci RAM, co drastycznie zwiększa koszt i trudność równoległego przeprowadzania ataków. Ponadto, możliwość dostosowywania parametrów N, r i p pozwala na elastyczne zarządzanie poziomem bezpieczeństwa w zależności od dostępnych zasobów. Wzrost wydajności sprzętu komputerowego z czasem może być rekompensowany przez zwiększenie tych parametrów, co pozwala na utrzymanie odpowiedniego poziomu odporności na ataki bez konieczności całkowitej zmiany algorytmu. Scrypt zapewnia więc długoterminowe bezpieczeństwo dla danych wrażliwych.

Zastosowania w praktyce

  • Bezpieczne przechowywanie haseł użytkowników w bazach danych aplikacji webowych i systemów operacyjnych.
  • Wyprowadzanie kluczy kryptograficznych z haseł użytkowników do szyfrowania danych na dyskach lub w chmurze, np. w systemach zarządzania kluczami.
  • Wydobywanie i weryfikacja transakcji w niektórych kryptowalutach, takich jak Litecoin czy Dogecoin, gdzie został on wykorzystany do zwiększenia decentralizacji i odporności na ataki ASIC.
  • Zabezpieczanie protokołów komunikacyjnych i uwierzytelniania, gdzie wymagane jest odporne na ataki haszowanie.

Porównanie z innymi strukturami danych

W porównaniu do innych popularnych funkcji wyprowadzania kluczy, takich jak PBKDF2 i bcrypt, scrypt wyróżnia się przede wszystkim silniejszą odpornością na ataki sprzętowe. PBKDF2, choć odporny na ataki CPU-hard, nie jest memory-hard, co czyni go podatnym na masowe równoległe ataki z użyciem GPU i ASIC, które mogą szybko testować miliony haseł na sekundę. Bcrypt, będący również memory-hard, oferuje solidną ochronę, ale scrypt został zaprojektowany z myślą o bardziej elastycznej konfiguracji parametrów pamięci i równoległości, co w pewnych scenariuszach może zapewnić jeszcze wyższy poziom bezpieczeństwa. Scrypt celowo wprowadza większe wymagania pamięciowe, co sprawia, że jego uruchomienie na karcie graficznej czy dedykowanym chipie ASIC staje się mniej efektywne kosztowo. Chociaż wszystkie te funkcje są lepsze niż proste haszowanie SHA-256 dla haseł, scrypt oferuje lepszą obronę przed przeciwnikami dysponującymi znacznymi zasobami sprzętowymi. Wybór między nimi często zależy od konkretnych wymagań bezpieczeństwa, dostępnych zasobów i ekosystemu, w którym mają być używane, choć scrypt jest generalnie uważany za bardziej odporny na przyszłe ataki sprzętowe.

Najlepsze praktyki (2026)

  • Zawsze używaj unikalnej i kryptograficznie bezpiecznej soli (ang. salt) o odpowiedniej długości dla każdego haszowanego hasła.
  • Regularnie aktualizuj parametry scrypt (N, r, p) w miarę wzrostu mocy obliczeniowej i dostępności pamięci, aby utrzymać pożądany poziom bezpieczeństwa.
  • Przechowuj wygenerowany skrót scrypt wraz z użytą solą i parametrami, aby móc prawidłowo zweryfikować hasło w przyszłości.
  • Implementuj scrypt w sposób zabezpieczający przed atakami czasowymi (timing attacks) poprzez używanie stałego czasu wykonania operacji weryfikacji hasła.
  • Przeprowadzaj testy wydajności, aby dobrać parametry N, r, p, które zapewnią odpowiedni balans między bezpieczeństwem a akceptowalnym czasem weryfikacji hasła dla Twojej aplikacji.

Typowe błędy i pułapki

  • Używanie zbyt niskich wartości parametrów N, r lub p, co osłabia odporność na ataki i czyni algorytm podatnym na brute-force.
  • Brak użycia soli lub używanie tej samej soli dla wielu haseł, co umożliwia ataki słownikowe i tęczowe tablice.
  • Niewłaściwe przechowywanie skrótów scrypt, np. bez soli lub parametrów, co uniemożliwia weryfikację lub otwiera drogę do osłabienia bezpieczeństwa.
  • Brak aktualizacji parametrów scrypt na przestrzeni czasu, co sprawia, że pierwotnie bezpieczne haszowanie staje się podatne na nowsze ataki sprzętowe.
  • Implementowanie scrypt w sposób niestandardowy lub z błędami, co może prowadzić do nieprzewidzianych luk bezpieczeństwa.