Entropia hasła: oblicz i wzmocnij swoje hasła
Pewnie nieraz padło stwierdzenie, że „silne hasło” potrzebuje wielkich liter, cyfr i znaków specjalnych. Ale P@$$w0rd! spełnia wszystkie te reguły — a mimo to można je złamać w mniej niż sekundę.
Prawdziwą miarą siły hasła nie jest to, jakich znaków się używa. Jest nią entropia: pojęcie z teorii informacji, które ujmuje liczbowo, jak nieprzewidywalne faktycznie jest hasło.
W tym przewodniku można dowiedzieć się dokładnie, jak działa entropia hasła, jak ją obliczyć i jak generować hasła naprawdę trudne do złamania.
Czym jest entropia hasła?
Entropia hasła mierzy, jak nieprzewidywalne jest hasło, i wyraża się ją w bitach. Każdy dodatkowy bit entropii podwaja liczbę prób potrzebnych atakującemu, by złamać hasło metodą brute-force.
Można to porównać do kości do gry. Sześcienna kość ma około 2,6 bita entropii na rzut — możliwych wyników jest tylko 6. Kość dwudziestościenna ma około 4,3 bita — więcej ścianek oznacza więcej niepewności.
Hasła działają tak samo: większa liczba możliwych znaków (większe „kości”) oraz większa liczba znaków w haśle (więcej „rzutów”) podnoszą entropię.
Dlatego entropia jest lepszą miarą niż reguły złożoności. Hasło może wyglądać złożenie (Tr0ub4dor&3), a mimo to mieć niską entropię, bo trzyma się przewidywalnych wzorców. Z kolei prosty z wyglądu passphrase (correct horse battery staple) może mieć wysoką entropię, bo pochodzi z dużej puli możliwości.
Wzór: jak obliczyć entropię hasła
Wzór jest prosty:
E = L × log₂(R)
Gdzie:
- E = entropia w bitach
- L = długość hasła (liczba znaków)
- R = wielkość puli (liczba możliwych znaków na pozycji)
Wielkości puli znaków
| Typ znaków | Wielkość puli (R) | Bity na znak |
|---|---|---|
| Tylko małe litery (a-z) | 26 | 4,70 |
| Małe litery + cyfry | 36 | 5,17 |
| Wielkie + małe + cyfry | 62 | 5,95 |
| Pełne drukowalne ASCII | 94 | 6,55 |
| Lista słów Diceware | 7 776 | 12,92 na słowo |
Obliczenie w kodzie
// Obliczanie entropii hasła w JavaScript
const entropy = (length, poolSize) =>
length * Math.log2(poolSize);
entropy(8, 26); // → 37.60 bitów (tylko małe litery)
entropy(12, 62); // → 71.45 bitów (alfanumerycznie)
entropy(16, 94); // → 104.87 bitów (pełny zestaw znaków)
import math
def entropy(length: int, pool_size: int) -> float:
return length * math.log2(pool_size)
entropy(8, 26) # → 37.60 bitów
entropy(12, 62) # → 71.45 bitów
entropy(16, 94) # → 104.87 bitów
Ważne: ten wzór zakłada, że każdy znak jest wybierany jednostajnie losowo. Jeśli hasło wybiera człowiek, opierając się na wzorcach lub słowach ze słownika, rzeczywista entropia jest znacznie niższa niż maksimum teoretyczne.
Ile entropii to wystarczająco?
Odpowiedź zależy od tego, co się chroni i jak szybko atakujący potrafi zgadywać.
Nowoczesne procesory GPU potrafią testować ponad 10¹² (jeden bilion) hashy haseł na sekundę przeciwko szybkim algorytmom takim jak MD5. Oto, co to oznacza w praktyce:
| Entropia (bity) | Siła | Czas złamania przy 10¹² prób/s | Zalecane do |
|---|---|---|---|
| < 40 | Słabe | Poniżej 1 sekundy | Nigdy nie używać |
| 40–59 | Średnie | Sekundy do godzin | Konta jednorazowe |
| 60–79 | Silne | Dni do stuleci | Zwykłe konta |
| 80–99 | Bardzo silne | Tysiąclecia+ | E-mail, bankowość |
| 100+ | Ekstremalne | Poza śmierć cieplną wszechświata | Klucze szyfrujące, hasła główne |
Hasło 16-znakowe z pełnego zestawu drukowalnego ASCII daje około 105 bitów entropii — głęboko w zakresie „ekstremalnym”. Można takie wygenerować od razu za pomocą naszego generatora haseł losowych, który dla każdego hasła pokazuje analizę entropii w czasie rzeczywistym.
Co mówi NIST (aktualizacja 2024)
NIST SP 800-63B, zaktualizowany w 2024 roku, wprowadził istotne zmiany w wytycznych dotyczących haseł:
- Usunięto obowiązkowe reguły złożoności (koniec wymuszonych znaków specjalnych)
- Usunięto obowiązkowe okresowe zmiany haseł
- Podniesiono minimum do 15 znaków (z 8 w poprzednich wersjach)
- Podkreślono sprawdzanie wobec znanych haseł z wycieków
- Postawiono na długość i losowość zamiast złożoności
Te zmiany odzwierciedlają to, co od dawna pokazuje matematyka entropii: długość i losowość znaczą więcej niż różnorodność znaków.
Dlaczego długość bije złożoność
Warto przyjrzeć się matematyce. Można rozważyć dwa sposoby zwiększenia entropii hasła 12-znakowego:
Wariant A — Pozostawić 12 znaków, przejść z alfanumerycznego (62) na pełne ASCII (94):
- 12 × log₂(94) - 12 × log₂(62) = 78,66 - 71,45 = +7,21 bita
Wariant B — Pozostawić alfanumeryczny (62), dodać jeden znak (12 → 13):
- 13 × log₂(62) - 12 × log₂(62) = 77,40 - 71,45 = +5,95 bita
Dodanie jednego znaku daje niemal tyle samo entropii, co przejście na znacznie większy zestaw znaków. Dodanie dwóch znaków pozwala go przekroczyć.
Teraz P@$$w0rd! (9 znaków). Korzysta z pełnej puli ASCII, ale jest za krótkie. Co gorsza, trzyma się przewidywalnego wzorca „leet speak”, który ataki słownikowe już obejmują, więc jego efektywna entropia jest dużo poniżej teoretycznych 59 bitów.
Wniosek: dla naprawdę losowych haseł dodawanie długości jest skuteczniejsze niż dodawanie typów znaków. Ale prawdziwym wrogiem jest przewidywalność, a nie krótkość.
Passphrase a hasło losowe
| Wymiar | Hasło losowe | Passphrase (Diceware) |
|---|---|---|
| Przykład | kX#9mP$2vL!nQ7wR | correct horse battery staple |
| Bity na jednostkę | 6,55 na znak | 12,92 na słowo |
| Długość dla ~78 bitów | 12 znaków | 6 słów |
| Łatwość zapamiętania | Słaba | Dobra |
| Wpisywanie na telefonie | Bolesne | Łatwe |
| Najlepsze do | Wpisy w menedżerze haseł | Hasła główne, zapamiętywane logowania |
Jak działa Diceware
Diceware używa listy 7 776 słów (6⁵ = 7 776). Pięcioma kostkami wybiera się każde słowo, co daje dokładnie 12,92 bita entropii na słowo.
Cztery słowa dają ~51 bitów; sześć słów daje ~77 bitów.
Którego użyć?
- Do haseł trzymanych w menedżerze: można użyć losowych haseł 16+ znaków z pełnymi zestawami znaków. Nigdy nie wpisuje się ich ręcznie, więc łatwość zapamiętania nie ma znaczenia. Nasz generator haseł losowych potrafi wygenerować nawet 50 haseł hurtem.
- Do hasła głównego: warto użyć passphrase Diceware z 5-6 słów. Jest na tyle zapamiętywalne, by wpisywać je codziennie, a daje 64-77 bitów entropii.
- Do kluczy API i tokenów: warto użyć
openssl randlubcrypto.randomBytes()dla maksymalnej entropii bez wymagania ludzkiej zapamiętywalności.
Entropia w praktyce: narzędzia i kod dla deweloperów
Oto najczęstsze sposoby, w jakie deweloperzy generują sekrety o wysokiej entropii:
Przeglądarka (Web Crypto API)
// Kryptograficznie bezpieczne generowanie hasła
function generatePassword(length, charset) {
const array = new Uint32Array(length);
crypto.getRandomValues(array);
return Array.from(array, v => charset[v % charset.length]).join('');
}
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*';
generatePassword(16, chars);
// → 'kX#9mP$2vL!nQ7wR' (losowe za każdym razem)
Node.js
const crypto = require('crypto');
const token = crypto.randomBytes(32).toString('base64url');
// → 'Ql2Hj8xK9mNp3rVw5tYz7uBa0cEf4gIk' (43 znaki, 256 bitów)
Python
import secrets
token = secrets.token_urlsafe(32) # 256 bitów entropii
password = secrets.token_hex(16) # 128 bitów, format hex
Wiersz poleceń
# 192 bity entropii, kodowanie base64
openssl rand -base64 24
# 256 bitów, kodowanie hex
openssl rand -hex 32
Porównanie entropii według metody
| Metoda | Długość wyjścia | Entropia (bity) |
|---|---|---|
| UUID v4 | 36 znaków | 122 |
openssl rand -base64 24 | 32 znaki | 192 |
| 16-znakowe pełne ASCII | 16 znaków | 105 |
| 6-słowowe Diceware | ~30 znaków | 78 |
| 4-słowowe Diceware | ~20 znaków | 52 |
Nigdy nie należy używać
Math.random()do niczego związanego z bezpieczeństwem. Korzysta z niekryptograficznego PRNG — wynik jest przewidywalny, jeśli atakujący zna ziarno. Zawsze należy używaćcrypto.getRandomValues()w przeglądarce lubcrypto.randomBytes()w Node.js.
Przechowywanie haseł: dlaczego sama entropia nie wystarczy
Nawet 128-bitowe hasło jest bezwartościowe, jeśli serwer trzyma je jako zwykły hash MD5. Po wycieku bazy atakujący potrafią testować biliony hashy MD5 na sekundę na pojedynczym GPU.
Tu wkraczają wolne algorytmy hashujące. Świadomie czynią każdą próbę kosztowną:
| Algorytm | Prędkość na GPU | Efektywne spowolnienie |
|---|---|---|
| MD5 | ~10 mld/s | Punkt odniesienia (nie używać) |
| SHA-256 | ~5 mld/s | ~2× wolniej |
| bcrypt (cost=12) | ~5/s | ~2 mld× wolniej |
| argon2id | ~2/s | ~5 mld× wolniej |
Parametr cost w bcrypt jest wyjątkowo elegancki: każde zwiększenie podwaja wymaganą pracę. Współczynnik kosztu 12 oznacza 2¹² = 4 096 rund hashowania. Efektywnie dodaje to 12 bitów „entropii przechowywania” na wierzch własnej entropii hasła.
Model dwuwarstwowej ochrony: hasła o wysokiej entropii chronią przed offline’owym brute-force, a wolne funkcje hashujące chronią przed wyciekami baz danych. Potrzebne są oba.
Więcej o algorytmach hash można znaleźć w naszym porównaniu MD5 i SHA-256 oraz przetestować generator MD5 hash, aby zobaczyć, jak różne algorytmy dają różne wyniki.
Najczęstsze mity o hasłach obalone
„Zmieniaj hasło co 90 dni”
Wytyczne NIST z 2024 roku jednoznacznie odradzają obowiązkowe okresowe zmiany. Częste rotacje skłaniają użytkowników do wybierania słabszych, bardziej przewidywalnych haseł — doklejania cyfry na końcu, krążenia po małym zestawie. Hasło warto zmieniać tylko wtedy, gdy istnieje powód, by sądzić, że zostało skompromitowane.
„a→@, e→3 czyni je silniejszym”
Podstawienia leet speak należą do pierwszych wzorców sprawdzanych przez ataki słownikowe. Zastąpienie a przez @ w password praktycznie nie dodaje entropii, bo atakujący już to przewidują.
To prawdziwa losowość — a nie sprytne podstawienia — zwiększa entropię.
„8 znaków z symbolami wystarczy”
Nawet z pełnym 94-znakowym zestawem ASCII 8 znaków daje tylko 52 bity entropii. Przy 10¹² próbach na sekundę to złamane w około 75 minut.
Należy używać minimum 12 znaków, 16+ dla ważnych kont.
„Im bardziej skomplikowane wygląda, tym bezpieczniejsze”
Złożoność wizualna i entropia to różne rzeczy. Tr0ub4dor&3 wygląda złożenie, ale trzyma się przewidywalnego wzorca słowo-bazowe-plus-podstawienia. mfYq8kL2nR wygląda prościej, ale ma wyższą entropię, bo jest naprawdę losowe.
Więcej o budowaniu kompleksowej strategii bezpieczeństwa można znaleźć w podstawach bezpieczeństwa webowego.
FAQ
Ile bitów entropii uchodzi za bezpieczne?
Dla większości kont online 60-80 bitów daje silną ochronę. Dla celów wysokiej wartości, takich jak hasła główne lub klucze szyfrujące, warto celować w 100+ bitów. Każdy dodatkowy bit podwaja wysiłek wymagany od atakującego.
Czy dodanie znaków specjalnych zawsze podnosi entropię?
Tylko wtedy, gdy znaki są wybierane losowo z pełnej puli. Przewidywalne podstawienia, takie jak @ zamiast a lub ! na końcu, praktycznie nie dodają entropii, bo atakujący uwzględniają te wzorce w swoich słownikach.
Jaka jest entropia 4-słowowego passphrase Diceware?
Korzystając ze standardowej listy Diceware liczącej 7 776 słów, każde słowo wnosi 12,92 bita. Cztery słowa dają w przybliżeniu 51,7 bita — wystarczająco do zastosowań o niskich wymaganiach bezpieczeństwa. Do ważnych kont warto użyć 5-6 słów (64-78 bitów).
Czy Math.random() jest bezpieczne do generowania haseł?
Nie. Math.random() to pseudolosowy generator liczb, który nie jest kryptograficznie bezpieczny. Do generacji wrażliwej na bezpieczeństwo należy używać crypto.getRandomValues() w przeglądarce lub crypto.randomBytes() w Node.js.
Jak współczynnik cost w bcrypt wpływa na bezpieczeństwo?
Każde zwiększenie współczynnika cost w bcrypt podwaja moc obliczeniową potrzebną do utworzenia hashu hasła (a tym samym do złamania go metodą brute-force). Cost równy 12 oznacza 2¹² = 4 096 iteracji, co efektywnie dodaje 12 bitów trudności na wierzch wewnętrznej entropii hasła.
Co zmieniło się w wytycznych NIST dotyczących haseł w 2024?
NIST SP 800-63B zrezygnował z obowiązkowych wymogów złożoności (wymuszone znaki specjalne, mieszane wielkości liter) oraz okresowej rotacji haseł. Nowe wytyczne preferują dłuższe hasła (zalecane 15+ znaków), sprawdzanie wobec baz wyciekniętych haseł oraz dopuszczanie wszystkich znaków drukowalnych, w tym spacji.
Najważniejsze wnioski
- Entropia = L × log₂(R) — każdy dodatkowy bit podwaja liczbę potrzebnych prób
- Długość > złożoność — dodanie jednego znaku jest skuteczniejsze niż rozszerzenie zestawu znaków
- Korzystaj z API kryptograficznych —
crypto.getRandomValues()lubcrypto.randomBytes(), nigdyMath.random() - Menedżer haseł + losowe generowanie to najlepsza praktyka dla większości osób
- Strona serwerowa też się liczy — używaj bcrypt lub argon2, nigdy nie przechowuj haseł z MD5
Czas wygenerować hasło o wysokiej entropii? Wypróbuj nasz generator haseł losowych — pokazuje analizę entropii w czasie rzeczywistym dla każdego utworzonego hasła.