Argon2 po ludzku: jak z hasła powstaje klucz szyfrujący
Haszowanie haseł po ludzku: czym jest Argon2, po co sól i pamięciożerność, jak wypada na tle bcrypta i jak Cappa zamienia hasło w klucz szyfrujący.

W tym artykule
Haszowanie haseł to zamiana hasła w krótki ciąg bajtów, z którego nie da się odtworzyć hasła, a Argon2 to jeden z najlepszych algorytmów takiego haszowania. Jest celowo powolny i zużywa dużo pamięci, więc każda próba zgadnięcia hasła kosztuje napastnika czas i pamięć. Argon2 wygrał konkurs Password Hashing Competition w 2015 roku, a jego specyfikacją jest RFC 9106. Cappa używa wariantu Argon2id, żeby z Twojego hasła głównego powstały klucze chroniące notatki.
Zaczynamy od zera: czym jest skrót, dlaczego zwykłe skróty nie nadają się do haseł, co znaczą „sól” i „pamięciożerność” oraz jak Argon2 wypada na tle bcrypta, scrypta i PBKDF2. Na koniec krok po kroku prześledzimy, jak Cappa zamienia jedno hasło w klucze.
Argon2: co to jest?
Argon2 to funkcja wyprowadzania klucza, bliska krewna funkcji skrótu, zaprojektowana z myślą o hasłach. Podajesz jej hasło, sól i kilka ustawień kosztu, a ona zwraca wynik o potrzebnej długości. Te same dane wejściowe zawsze dają ten sam wynik, a odwrócić tego obliczenia w praktyce się nie da.
Argon2 powstał w ramach Password Hashing Competition, otwartego konkursu, w którym kryptografowie od 2013 do 2015 roku szukali lepszego sposobu ochrony haseł. W lipcu 2015 roku jury ogłosiło jego zwycięstwo. We wrześniu 2021 roku IETF opublikowała go jako RFC 9106, formalną specyfikację, według której powstają implementacje.
- Funkcja wyprowadzania klucza (KDF)
- Funkcja, która z jednego sekretu (tu: Twojego hasła) tworzy klucze kryptograficzne o stałym rozmiarze. KDF oparta na haśle jest celowo powolna, żeby zgadywanie haseł było kosztowne.
Czym jest skrót: odcisk palca danych
Funkcja skrótu przyjmuje dowolne dane, jedno słowo albo cały film, i tworzy krótki „odcisk palca” o stałej długości. SHA-256, jedna z najpopularniejszych, zawsze daje 256 bitów, zwykle zapisywanych jako 64 znaki szesnastkowe.
Odcisk ma trzy przydatne cechy. Te same dane zawsze dają ten sam odcisk. Drobna zmiana daje zupełnie inny. A z odcisku nie da się odtworzyć danych. Oto prawdziwe skróty SHA-256 dwóch słów różniących się tylko wielką literą:
SHA-256("notatka") = 2dd802ecd137b014aab569707cb21036d45e7365bbad2f756b97c1009183df41
SHA-256("Notatka") = a2db53fb98a78ef528bc8ed63955d6f41d04c55854ded41fb549030a75fad843
Dlatego serwisy przechowują skrót zamiast hasła. Przy logowaniu liczą skrót tego, co wpisałeś, i porównują odciski. Jeśli baza wycieknie, napastnik dostaje odciski, a nie hasła.
Haszowanie haseł: dlaczego szybkie skróty to złe narzędzie
Skrótu nie da się odwrócić, ale można zgadywać. Napastnik z wykradzionym odciskiem bierze kandydata na hasło, liczy jego skrót i sprawdza, czy pasuje. Potem następnego kandydata, i kolejnego.
SHA-256 i MD5 zaprojektowano tak, żeby były szybkie, bo sprawdzenie dużego pobranego pliku ma trwać chwilę. Ta szybkość pomaga napastnikowi. W publicznych testach hashcata jedna karta graficzna RTX 4090 liczy około 163 miliardów skrótów MD5 i 22 miliardów SHA-256 na sekundę. W takim tempie wiele haseł wymyślanych przez ludzi pada w ciągu kilku minut.
Haszowanie haseł odwraca ten problem. Celem jest funkcja wystarczająco szybka dla Ciebie, bo liczysz ją raz przy logowaniu, i dotkliwie wolna dla kogoś, kto musi ją policzyć miliardy razy.
Sól: składnik inny dla każdego konta
Gdyby hasło każdego użytkownika przechodziło przez ten sam przepis, napastnik mógłby raz policzyć odciski milionów popularnych haseł i sprawdzać każdy skradziony skrót w takiej tablicy. Dwie osoby z tym samym hasłem miałyby też ten sam odcisk, co samo w sobie coś zdradza.
- Sól
- Wartość dodawana do hasła przed haszowaniem, inna dla każdego konta. Nie musi być tajna. Jej zadaniem jest sprawić, że to samo hasło daje różne wyniki u różnych osób, więc każde konto trzeba atakować osobno.
Pomyśl o niej jak o przyprawie, którą każdy kucharz dodaje po swojemu: dwie osoby gotujące według tego samego przepisu i tak dostaną dania o innym smaku.
Cappa buduje sól z dwóch elementów: adresu e-mail konta i losowego, 16-bajtowego ziarna, które powstaje od nowa przy rejestracji, zmianie hasła i odzyskaniu konta. Aplikacja łączy je, razem ze stałą etykietą i numerem wersji, funkcją SHA-256. Wplecenie adresu e-mail ma konkretny cel. Ustawienia Argon2id są zapisane na stałe w aplikacji, a sól zawsze zawiera Twój adres, więc nawet nieuczciwy serwer nie poda wielu kontom tej samej soli ani tańszego przepisu, który ułatwiłby masowe zgadywanie (o ile kod aplikacji działający w Twojej przeglądarce jest prawdziwy).
Celowo powolny i pamięciożerny
Spowolnić skrót jest łatwo: wystarczy powtórzyć go wiele razy. Starsze metody, jak PBKDF2, robią właśnie to. Kłopot w tym, że powtarzanie kosztuje tylko czas obliczeń, a karty graficzne i specjalizowane układy mają ogromną, tanią moc obliczeniową działającą równolegle.
Argon2 kosztuje także pamięć. Każde uruchomienie wypełnia duży blok pamięci pseudolosowymi danymi, a potem kilka razy go przechodzi, przy czym każdy nowy fragment zależy od wcześniejszych, rozrzuconych po całym bloku. Nie da się przeskoczyć naprzód ani policzyć tego z mniejszą pamięcią bez dużej kary w postaci dodatkowej pracy.
Tak działa „pamięciożerność” (memory-hardness) i dlatego Argon2 spowalnia napastnika dużo bardziej niż Ciebie. Przy ustawieniach Cappy informacje o wydaniu hashcata 7.0 podają około 1703 prób na sekundę na tej samej karcie RTX 4090, która liczy 163 miliardy skrótów MD5 na sekundę. Ile to oznacza w czasie dla prawdziwych haseł, pokazujemy w tekście o tym, jak długie powinno być hasło główne.
Argon2d, Argon2i i Argon2id: który wariant?
RFC 9106 opisuje trzy warianty. Argon2d wybiera, którą część pamięci odczytać, na podstawie samych danych. Dobrze opiera się atakom z użyciem kart graficznych, ale na współdzielonym komputerze może zdradzać informacje przez pomiar czasu. Argon2i czyta pamięć w stałej kolejności, niezależnej od hasła, co zamyka ten wyciek. Argon2id przez pierwszą połowę pierwszego przebiegu działa jak Argon2i, a potem jak Argon2d, łącząc zalety obu.
RFC wymaga, żeby każda implementacja obsługiwała Argon2id, i radzi wybrać go w razie wątpliwości. OWASP Password Storage Cheat Sheet również stawia go na pierwszym miejscu. Cappa używa Argon2id.
Trzy ustawienia Argon2 po ludzku
| Ustawienie | Co oznacza | Wartość w Cappie |
|---|---|---|
| Pamięć (m) | Jak duży jest „pokój”: pamięć, którą musi wypełnić każde uruchomienie | 64 MiB |
| Przebiegi (t) | Ile razy obliczenie przechodzi przez tę pamięć | 3 |
| Równoległość (p) | Ile niezależnych torów może działać jednocześnie | 1 |
| Długość wyniku | Ile bajtów wychodzi na końcu | 32 bajty (256 bitów) |
Dla porównania: druga zalecana opcja w RFC 9106 to 64 MiB, 3 przebiegi i 4 tory. Cappa używa tej samej pamięci i liczby przebiegów z jednym torem, co pasuje do pojedynczego wątku w tle przeglądarki. Minimum OWASP dla haseł przechowywanych na serwerze jest niższe (na przykład 19 MiB i 2 przebiegi), bo obciążony serwer haszuje hasła wielu użytkowników naraz.
Ile trwa jedno obliczenie? W naszym teście na laptopie z procesorem Apple M4 Pro jedno uruchomienie z ustawieniami Cappy, przy użyciu tej samej biblioteki WebAssembly co aplikacja, trwało około 0,1 sekundy. Starsze telefony potrzebują zauważalnie więcej. Ty płacisz ten koszt raz, przy odblokowaniu. Napastnik płaci go przy każdej próbie.
Hasło do logowania a klucz szyfrujący: dwie różne role
Ten sam Argon2 może wykonywać dwa różne zadania, a różnica ma znaczenie.
Haszowanie hasła logowania (serwer)
- Serwer przechowuje skrót i porównuje go przy każdym logowaniu
- Serwer może ograniczać próby, blokować konta i ostrzegać
- Ustawienia można podnieść przy następnym logowaniu
- Wykradziony skrót pozwala zgadywać offline
Wyprowadzanie klucza szyfrującego (Twoje urządzenie)
- Wynik nie jest nigdzie zapisywany; to jest klucz, który otwiera dane
- Każdy, kto ma kopię zaszyfrowanych danych, może zgadywać offline i nikt go nie zatrzyma
- Ustawienia są częścią formatu danych, więc ich zmiana wymaga nowej wersji
- Działa na Twoim urządzeniu, więc musi dać radę na przeciętnym telefonie
W aplikacji z szyfrowaniem end-to-end ważniejsze jest drugie zadanie. Serwer nie widzi Twojego hasła, więc nie może go za Ciebie zahaszować. Urządzenie musi samo wyprowadzić klucz, a koszt tego wyprowadzenia jest główną przeszkodą między skradzioną bazą a Twoimi notatkami.
Funkcja wyprowadzania klucza w praktyce: jak Cappa zamienia hasło w klucze
Cappa wykonuje oba zadania, w tej kolejności:
Hasło główne + sól
Twoje hasło oraz sól z adresu e-mail i losowego, 16-bajtowego ziarna
Argon2id
64 MiB, 3 przebiegi, 1 tor
Klucz główny
32 bajty, dzielone funkcją HKDF-SHA-256 na dwa niezależne klucze
authKey
Potwierdza Twoją tożsamość przy logowaniu
Serwer
Haszuje authKey ponownie funkcją Argon2id i przechowuje tylko ten skrót
Klucz hasła (KEK)
Nigdy nie opuszcza przeglądarki
Koperta klucza sejfu
Zawiera losowy klucz sejfu, który szyfruje Twoje notatki
Hasło zostaje przygotowane. Aplikacja zamienia je na standardową postać Unicode (NFC) i koduje jako bajty. Nic nie jest przycinane, więc spacje się liczą.
Argon2id działa w Web Workerze. Web Worker to wątek w tle przeglądarki, dzięki czemu strona reaguje normalnie, gdy trwa pamięciożerne obliczenie. Wynikiem jest 32-bajtowy klucz główny (root key).
HKDF dzieli klucz główny na dwa. HKDF-SHA-256 (RFC 5869) to szybki, standardowy sposób wyprowadzania kilku niezależnych kluczy z jednego mocnego sekretu. Różne etykiety dają dwa niepowiązane klucze: authKey i klucz hasła (KEK, key-encryption key, czyli klucz szyfrujący inny klucz).
authKey potwierdza, kim jesteś. Trafia na serwer jako hasło konta. Serwer przed zapisaniem haszuje go ponownie funkcją Argon2id, więc kopia bazy nie zawiera wartości, która od razu pozwala się zalogować.
Klucz hasła otwiera sejf. Sejf to zaszyfrowany zbiór Twoich notatek. Klucz hasła nigdy nie opuszcza przeglądarki. Odszyfrowuje małą „kopertę” z kluczem sejfu, czyli losowym, 256-bitowym kluczem, który szyfruje Twoje notatki algorytmem AES-256-GCM.
Znajomość authKey nie zdradza klucza hasła, bo HKDF czyni je niezależnymi. Samo hasło nigdy nie opuszcza przeglądarki. Pełny obraz tego, co przechowuje serwer, znajdziesz w tekście o tym, co widzi serwer.
Argon2 vs bcrypt, scrypt i PBKDF2
Wszystkie cztery to uznane funkcje haszowania haseł. Różnią się tym, za co każą płacić napastnikowi.
| Funkcja | Rok | Co jest kosztowne | Ustawienia OWASP (stan na wrzesień 2026) | Uczciwa ocena |
|---|---|---|---|---|
| Argon2id | 2015 (RFC 9106 w 2021) | Czas i regulowana ilość pamięci | Minimum 19 MiB, 2 przebiegi, 1 tor (lub odpowiednik) | Pierwszy wybór w nowych systemach |
| scrypt | 2009 | Czas i pamięć | N=2^17 (128 MiB), r=8, p=1 | Mocny; wybór OWASP, gdy Argon2id jest niedostępny |
| bcrypt | 1999 | Czas, przy małej, stałej pamięci (ok. 4 KiB) | Współczynnik kosztu co najmniej 10; hasła do 72 bajtów | Wciąż do przyjęcia w starszych systemach; limit 72 bajtów i mała pamięć zdradzają wiek |
| PBKDF2 | 2000 | Tylko czas (powtarzane haszowanie) | 600 000 iteracji z HMAC-SHA-256 | Gdy wymagana jest zgodność z FIPS-140; najtańszy do atakowania kartami graficznymi |
Wartości OWASP pochodzą z Password Storage Cheat Sheet, który podaje też równoważne kombinacje Argon2id i scrypt, wymieniające pamięć na przebiegi. Te minima dotyczą serwerów obsługujących wiele logowań. Klucz liczony raz na Twoim urządzeniu może sobie pozwolić na więcej, dlatego Cappa używa 64 MiB i 3 przebiegów.
Argon2 vs bcrypt w jednym zdaniu: bcrypt to sprawdzona konstrukcja z 1999 roku, wciąż wystarczająca w wielu systemach logowania, ale Argon2id pozwala wybrać, ile pamięci kosztuje każda próba, dzięki czemu lepiej radzi sobie z dzisiejszymi kartami graficznymi i lepiej nadaje się do wyprowadzania kluczy szyfrujących.
Czego powolne haszowanie nie zrobi
Najczęstsze pytania
Czy Argon2 to szyfrowanie?
Nie. Szyfrowanie da się odwrócić właściwym kluczem, a Argon2 to funkcja jednokierunkowa. W Cappie Argon2id tworzy klucze, a samym szyfrowaniem zajmuje się osobny szyfr, AES-256-GCM.
Czy Argon2 jest lepszy od bcrypt?
W nowych systemach zazwyczaj tak: OWASP stawia Argon2id na pierwszym miejscu, a bcrypt poleca dla starszych systemów. Główna przewaga polega na tym, że Argon2id każe napastnikowi płacić pamięcią, a nie tylko czasem, i nie ma limitu 72 bajtów na hasło. Dobrze skonfigurowany bcrypt i tak jest dużo lepszy niż szybki skrót.
Czy skrót Argon2 da się złamać?
Nie da się go odwrócić, ale można zgadywać. Napastnik liczy skróty kolejnych kandydatów i porównuje wyniki. Argon2id sprawia, że każda próba jest powolna i wymaga dużo pamięci, więc mocne, losowe hasła pozostają poza zasięgiem, a popularne wciąż padają.
Dlaczego odblokowanie Cappy trwa chwilę?
Twoje urządzenie przy każdym wyprowadzaniu kluczy uruchamia Argon2id z 64 MiB pamięci i 3 przebiegami. Ta krótka chwila to ten sam koszt, który płaci napastnik przy każdej próbie, i właśnie o to chodzi.
Czy serwer kiedykolwiek widzi moje hasło główne?
Nie. Serwer dostaje tylko wyprowadzony z niego authKey i haszuje go ponownie funkcją Argon2id. Zakłada to, że kod aplikacji uruchomiony w Twojej przeglądarce jest prawdziwy; kod podmieniony na przejętym serwerze mógłby przechwycić hasło.


