0Pricing
Cloud & IT Cert Prep · Lekcja

Funkcje wyprowadzania klucza: PBKDF2, bcrypt i Argon2

Porównuj algorytmy haszowania haseł pod kątem odporności na ataki GPU i ASIC oraz poznaj sposób dostrajania współczynników pracy i wymagań pamięciowych.

Funkcje wyprowadzania klucza: PBKDF2, bcrypt i Argon2 to bezpłatna lekcja Cloud & IT Cert Prep na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Cloud & IT Cert Prep, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Cloud & IT Cert Prep zawiera 4 lekcji w sumie.

Dlaczego haszowanie haseł jest inne

Przechowywanie haseł wymaga specjalnej klasy funkcji kryptograficznych nazywanej funkcją haszującą hasła (PHF) lub funkcją wyprowadzania klucza (KDF). Zwykłe kryptograficzne funkcje skrótu, takie jak SHA-256, projektuje się tak, aby były szybkie — nowoczesny procesor GPU może obliczać miliardy skrótów SHA-256 na sekundę. Ta szybkość jest katastrofalna dla przechowywania haseł: atakujący, który wykradnie bazę skrótów, może sprawdzać miliardy prób na sekundę. Funkcje KDF dla haseł są celowo powolne i można je dostrajać tak, aby ataki brute force były obliczeniowo nieopłacalne, a jednocześnie umożliwiały legalne logowanie w ciągu milisekund.

Sól: ochrona przed tablicami tęczowymi

Zanim powstały dedykowane funkcje KDF dla haseł, atakujący używali tablic tęczowych — wstępnie obliczonych odwzorowań wartości skrótów na odpowiadające im hasła w tekście jawnym. Sól to losowa wartość unikalna dla każdego użytkownika, dołączana przed hasłem lub po nim przed wykonaniem haszowania. Dzięki temu każdy skrót jest unikalny, nawet gdy hasła są identyczne. Sole są przechowywane w bazie danych razem ze skrótem — nie są tajne, lecz losowe. Prawidłowa sól musi mieć co najmniej 16 bajtów, być wygenerowana przez kryptograficznie bezpieczny generator liczb losowych i być przechowywana oddzielnie dla każdego użytkownika (nigdy nie należy używać jej ponownie dla różnych kont).

PBKDF2: standard dla haseł

PBKDF2 (Password-Based Key Derivation Function 2) jest zdefiniowana w RFC 8018 i zatwierdzona przez NIST. Działa poprzez wielokrotne zastosowanie funkcji HMAC (zwykle HMAC-SHA-256) do hasła i soli, przez konfigurowalną liczbę iteracji. Liczba iteracji jest współczynnikiem pracy — od 2023 roku NIST zaleca co najmniej 600 000 iteracji PBKDF2-HMAC-SHA256. PBKDF2 jest szeroko stosowana (Django, iOS Keychain, WPA2-PSK), ale ma jedną wadę: można ją wydajnie implementować na procesorach GPU, przez co jest mniej odporna na ataki z użyciem GPU niż alternatywne rozwiązania.

# PBKDF2 example (Python pseudocode concept)
# import hashlib
# dk = hashlib.pbkdf2_hmac(
#   'sha256',         # hash algorithm
#   b'password',      # password bytes
#   b'random_salt',   # salt bytes
#   600000            # iterations
# )

bcrypt: odporność na użycie pamięci i procesora

bcrypt został zaprojektowany przez Nielsa Provosa i Davida Mazièresa w 1999 roku i nadal jest szeroko stosowany. Jego kluczową innowacją jest współczynnik kosztu (parametr rounds), przy czym każdy jego przyrost podwaja czas obliczeń. bcrypt używa zmodyfikowanego szyfru Blowfish z mechanizmem Eksblowfish key setup, który intensywnie wykorzystuje zarówno procesor, jak i pamięć, przez co znacznie trudniej go przyspieszyć na GPU niż PBKDF2. bcrypt ogranicza również dane wejściowe hasła do 72 bajtów (dłuższe hasła są obcinane), dlatego w niektórych implementacjach długie hasła trzeba najpierw zahaszować za pomocą SHA-256.

# bcrypt cost factor
# Cost 10 = ~100ms on modern hardware
# Cost 12 = ~400ms
# Cost 14 = ~1600ms
# Each +1 doubles the work
# Recommended: cost 12-14 for web apps
# Command: htpasswd -bnBC 12 username password

Argon2: nowoczesny zwycięzca

Argon2 wygrał konkurs Password Hashing Competition w 2015 roku i jest obecnie zalecany przez OWASP. Występuje w trzech wariantach: Argon2d (szybszy, podatny na ataki z kanałem bocznym, najlepszy dla kryptowalut), Argon2i (działający w stałym czasie, najlepszy do haszowania haseł) oraz Argon2id (hybrydowy, zalecany w większości zastosowań). Argon2id można konfigurować w trzech wymiarach: koszt czasowy (liczba iteracji), koszt pamięci (wymagana pamięć RAM) oraz równoległość (liczba wątków). Wysokie wymagania pamięciowe bardzo utrudniają równoległe wykonywanie obliczeń na GPU i całkowicie uniemożliwiają ich efektywną realizację na układach ASIC.

# Argon2id recommended parameters (OWASP 2023)
# Memory: 64MB (65536 KiB)
# Iterations: 3
# Parallelism: 4 threads
# Output length: 32 bytes
# argon2 -id -t 3 -m 16 -p 4 -l 32

Odporność pamięciowa: dlaczego powstrzymuje ataki GPU

Procesory GPU mają tysiące rdzeni, ale ograniczoną ilość pamięci przypadającą na każdy rdzeń — doskonale nadają się do równoległego wykonywania prostych obliczeń wymagających niewielkiej ilości pamięci. Funkcje odporne na ograniczenia pamięci, takie jak Argon2 i scrypt, wymagają dużej ilości pamięci RAM przy każdym obliczaniu skrótu. Jeśli atakujący chce uruchomić 10 000 równoległych obliczeń Argon2id, z których każde wymaga 64 MB pamięci, potrzebuje 640 GB pamięci GPU — znacznie więcej, niż jest dostępne w jakimkolwiek klastrze GPU. Ta właściwość, nazywana odpornością pamięciową, zmusza atakujących do korzystania z powolnych, sekwencyjnych obliczeń albo ponoszenia ogromnych kosztów sprzętowych, które sprawiają, że ataki stają się nieopłacalne.

Dostrajanie współczynnika pracy w praktyce

Właściwy współczynnik pracy zależy od używanego sprzętu i akceptowalnego opóźnienia. Ogólnym celem jest 100–300 ms na serwerowym sprzęcie produkcyjnym przy każdym uwierzytelnianiu. Wraz z rozwojem sprzętu należy zwiększać współczynnik pracy — dlatego bcrypt i Argon2 przechowują parametry razem ze skrótem, umożliwiając przezroczyste aktualizacje: przy następnym logowaniu należy zweryfikować hasło, a następnie ponownie obliczyć jego skrót z użyciem nowych, wyższych parametrów. OWASP publikuje aktualne zalecane wartości minimalne parametrów PBKDF2, bcrypt i Argon2id, które należy przeglądać co roku.

scrypt: inna funkcja KDF odporna na ograniczenia pamięci

scrypt, zaprojektowany przez Colina Percivala w 2009 roku, był pierwszą szeroko stosowaną funkcją KDF odporną na ograniczenia pamięci i jest używany przez Litecoin oraz wiele menedżerów haseł. Parametry scrypt to N (koszt procesora i pamięci), r (rozmiar bloku) oraz p (współczynnik równoległości). Podobnie jak Argon2, wysokie wartości N wymagają dużej ilości pamięci RAM przy każdym obliczeniu. scrypt jest uznawany za bezpieczny, ale w nowych aplikacjach zwykle preferuje się Argon2id, ponieważ wygrał konkurs PHC i został poddany dokładniejszej analizie kryptograficznej. Oba rozwiązania są dopuszczalnym wyborem.

Czego NIE używać: MD5, SHA-1 i SHA bez soli

W przypadku haseł nigdy nie należy używać kilku podejść do haszowania: MD5 (złamany, na sprzęcie konsumenckim można obliczać miliardy skrótów na sekundę), SHA-1 (ten sam problem), SHA-256 bez soli (szybki, a użycie tablic tęczowych jest banalne) ani prostego szyfrowania (odwracalne, więc kradzież klucza oznacza ujawnienie wszystkich haseł). W wyniku historycznych wycieków, takich jak LinkedIn (2012), gdzie użyto SHA-1 bez soli, ujawniono 117 milionów haseł, które złamano w ciągu kilku dni. Firma Adobe (2013) zaszyfrowała hasła zamiast je zahaszować — był to fundamentalny błąd, który doprowadził do ujawnienia 153 milionów kont. Te incydenty znajdują się w zakresie materiału egzaminacyjnego Security+.

Wyprowadzanie kluczy szyfrujących

Funkcje KDF służą także do wyprowadzania kluczy szyfrujących z haseł (zamiast przechowywania skrótów haseł). Gdy użytkownik ustawia hasło główne do zaszyfrowanego sejfu, aplikacja używa funkcji KDF do wyprowadzenia właściwego klucza szyfrującego AES-256 na podstawie tego hasła. Dzięki temu menedżery haseł mogą lokalnie odszyfrowywać sejf — uruchamiają funkcję KDF dla hasła głównego, aby odtworzyć klucz szyfrujący, który nigdy nie opuszcza urządzenia. HKDF (HMAC-based Key Derivation Function) to standard służący do wyprowadzania wielu kluczy z pojedynczego sekretu o wysokiej entropii; jest używany w TLS 1.3 do wyprowadzania kluczy uzgadniania i kluczy aplikacji.

Credential Stuffing i ochrona za pomocą KDF

Credential stuffing polega na wykorzystywaniu par nazw użytkowników i haseł skradzionych podczas jednego ataku do uzyskiwania dostępu do innych usług. Silne funkcje KDF skracają czas dostępny na łamanie haseł w trybie offline po wycieku danych — jeśli osoba atakująca musi poświęcić 300 ms na każdą próbę zamiast kilku mikrosekund, złamanie losowego hasła o długości 10 znaków staje się obliczeniowo niewykonalne. Funkcje KDF nie chronią jednak przed ponownym używaniem haseł w różnych serwisach — w tym celu użytkownicy muszą stosować unikatowe hasła. Połączenie unikatowych haseł + przechowywania za pomocą Argon2id + MFA sprawia, że ataki oparte na danych uwierzytelniających stają się w praktyce nieskuteczne.

Szybki sprawdzian

Sprawdź swoją znajomość zagadnień CompTIA Security+ (SY0-701) omówionych w tej lekcji.

Podsumowanie lekcji

W tej lekcji dowiedziałeś się, że: funkcje KDF dla haseł są celowo powolne i mają konfigurowalne parametry nakładu pracy, aby ataki brute force w trybie offline stały się obliczeniowo niewykonalne; funkcje wymagające dużej ilości pamięci, takie jak Argon2id i scrypt, ograniczają możliwość równoległego przetwarzania na GPU, ponieważ każda operacja wymaga dużej ilości pamięci RAM; a MD5, SHA-1 i hasze bez soli są całkowicie nieodpowiednie do przechowywania haseł, co potwierdziły liczne głośne przypadki wycieku danych. W następnej części omówimy kryptografię postkwantową oraz algorytmy wybrane przez NIST w celu zastąpienia RSA i ECC.

Często zadawane pytania

Czy lekcja „Funkcje wyprowadzania klucza: PBKDF2, bcrypt i Argon2” jest bezpłatna?

Tak — pełny tekst „Funkcje wyprowadzania klucza: PBKDF2, bcrypt i Argon2” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Cloud & IT Cert Prep, przejdź na CoddyKit PRO. Kurs Cloud & IT Cert Prep zawiera 4 lekcji w sumie.

Co nauczysz się w „Funkcje wyprowadzania klucza: PBKDF2, bcrypt i Argon2”?

Porównuj algorytmy haszowania haseł pod kątem odporności na ataki GPU i ASIC oraz poznaj sposób dostrajania współczynników pracy i wymagań pamięciowych. Ćwiczysz Cloud & IT Cert Prep z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Cloud & IT Cert Prep?

Nie wymagamy żadnego doświadczenia. Cloud & IT Cert Prep w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Funkcje wyprowadzania klucza: PBKDF2, bcrypt i Argon2”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Cloud & IT Cert Prep?

Tak. Każda lekcja Cloud & IT Cert Prep zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Uzgadnianie TLS 1.3 i wznowienie 0-RTT
  2. Szyfrowanie uwierzytelnione: AES-GCM i ChaCha20-Poly1305
  3. Funkcje wyprowadzania klucza: PBKDF2, bcrypt i Argon2
  4. Kryptografia postkwantowa: CRYSTALS-Kyber i Dilithium
← Powrót do Cloud & IT Cert Prep