Skip to content
Powrót do bloga
Bezpieczeństwo

Entropia hasła: oblicz i wzmocnij swoje hasła

Opanuj entropię hasła: wzór, matematyka brute-force i dlaczego długość bije złożoność. Z kodem JS/Python i darmowym generatorem.

10 min czytania

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ówWielkość puli (R)Bity na znak
Tylko małe litery (a-z)264,70
Małe litery + cyfry365,17
Wielkie + małe + cyfry625,95
Pełne drukowalne ASCII946,55
Lista słów Diceware7 77612,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łaCzas złamania przy 10¹² prób/sZalecane do
< 40SłabePoniżej 1 sekundyNigdy nie używać
40–59ŚrednieSekundy do godzinKonta jednorazowe
60–79SilneDni do stuleciZwykłe konta
80–99Bardzo silneTysiąclecia+E-mail, bankowość
100+EkstremalnePoza śmierć cieplną wszechświataKlucze 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

WymiarHasło losowePassphrase (Diceware)
PrzykładkX#9mP$2vL!nQ7wRcorrect horse battery staple
Bity na jednostkę6,55 na znak12,92 na słowo
Długość dla ~78 bitów12 znaków6 słów
Łatwość zapamiętaniaSłabaDobra
Wpisywanie na telefonieBolesneŁatwe
Najlepsze doWpisy 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 rand lub crypto.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

MetodaDługość wyjściaEntropia (bity)
UUID v436 znaków122
openssl rand -base64 2432 znaki192
16-znakowe pełne ASCII16 znaków105
6-słowowe Diceware~30 znaków78
4-słowowe Diceware~20 znaków52

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 lub crypto.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ą:

AlgorytmPrędkość na GPUEfektywne spowolnienie
MD5~10 mld/sPunkt 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

  1. Entropia = L × log₂(R) — każdy dodatkowy bit podwaja liczbę potrzebnych prób
  2. Długość > złożoność — dodanie jednego znaku jest skuteczniejsze niż rozszerzenie zestawu znaków
  3. Korzystaj z API kryptograficznychcrypto.getRandomValues() lub crypto.randomBytes(), nigdy Math.random()
  4. Menedżer haseł + losowe generowanie to najlepsza praktyka dla większości osób
  5. 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.

Powiązane artykuły

Zobacz wszystkie artykuły