Atak słownika - Kompleksowa obsługa
Dokument referencyjny projektu Time2Crack
Odbiorcy: deweloperzy, badacze bezpieczeństwa, zaawansowani użytkownicy
Spis treści
isDictWord()addDictionaryAttacks()applyHighFidelityCalibration()1. Przegląd
Atak słownika jest najstarszą metodą łamania haseł, najprostszą koncepcyjnie i statystycznie najskuteczniejszą na większości prawdziwych haseł ludzkich. Jego zasadą jest testowanie, w kolejności malejącej prawdopodobieństwa, wstępnie skompilowanej listy kandydatów - "słownika" - zamiast wyczerpująco wyliczać wszystkie możliwe kombinacje, jak to robi surowa siła.
Dlaczego jest okropnie skuteczny? Ludzie nie wybierają swoich haseł losowo. Dekady wycieków danych pokazują, że rzeczywisty rozkład haseł jest niezwykle skoncentrowany: najczęstsze 1000 haseł stanowią około 5 do 10% wszystkich kont online. Najczęstsze 1 milion pokrywa 40 do 60%. Dobrze zbudowany atak słownika przetestuje tych kandydatów w milisekundach do sekund - gdzie siła brutto zajęłaby miliony lat.W Time2Crack, atak słownika modeluje dwa odrębne, ale uzupełniające się mechanizmy:
Te dwa badania są niezależne i uzupełniające: HiBP obejmuje dokładne poświadczenia kompromisowe, lista słów obejmuje wspólne słowa jeszcze nie wyciekły.
2. Tło historyczne i akademickie
2.1 Początki
Atak słownika poprzedza współczesną erę bezpieczeństwa komputera. Pierwsze systemy Unix przechowywane hasła w języku prostym w /etc/passwd, co każdy atak słownika trywialny jak tylko plik był dostępny.
2.2 Wycieki z zakładu
Niektóre przecieki zmieniły krajobraz ataku przez słownika, ujawniając rzeczywisty rozkład haseł ludzkich:
RockYou (2009) Deweloper przechowywał 14,3 miliona haseł w zwykłym języku.- Hasło # 1 ("123456") reprezentowało 290,731 rachunków (2%)
2.3 Wartości odniesienia dla ataku słownika
Lista 200 000 wpisów testowana z prędkością RTX 4090:
AlgorytmPrędkośćCzas dla kandydatów na 200k To...Czy...To... MD5168.9 GH / s- 1,2 nanosekundy SHA-150,86 GH / s- 3.9 nanosekundy SHA- 25622, 68 GH / s- 8,8 nanosekundy NTLM288,5 GH / s~ 0,7 nanosekunda bcrypt (koszt 5)184 kH / s- 1,09 sekundy. Argon2id- 67 H / s- 50 minutAtak słownika jest więc niemal natychmiastowy dla MD5, SHA-1 i NTLM - i pozostaje bardzo szybki nawet dla bcrypt na małych listach.
3. Fundamenty koncepcyjne: dlaczego słowniki działają
3.1 Prawo władzy haseł ludzkich
Wszystkie badania empiryczne zbliżają się do tej samej obserwacji: dystrybucja haseł ludzkich nie jest jednorodna - następuje prawo władzy (Zipf). Niektóre hasła koncentrują nieproporcjonalną część wyborów.
Formalnie : jeżeli wszystkie hasła są klasyfikowane przez zmniejszającą się częstotliwość, częstotliwość hasła rank do jest proporcjonalne do r ^ (- α) z α 1,5 do 2 Według korpusu.Bezpośrednie konsekwencje: 10 najczęściej używanych haseł Napastnik, który testuje tylko 10 kandydatów ma już szansę w 20 odnieść sukces - statystycznie, jest ogromny dla ilości generowanego hałasu.
3.2 Bia kognitywne w tworzeniu haseł
Ludzie nie wybierają losowo, systematycznie stosują heurystykę, która czyni ich hasła przewidywalnymi:
3.3 Koncepcja "hasła już na liście"
Hasło może być na liście ataków z dwóch różnych powodów:
Powód 1 - Jest w HiBP Dokładna wiarygodność została naruszona w przeszłości wycieku. Atakujący nie musi zgadywać - testuje znane referencje jeden po drugim, w kolejności częstotliwości. Jeśli serwer docelowy akceptuje akredytację, jest skończony. Powód 2 - znajduje się na liście słowników Hasło jest zwyczajnym słowem wspólnego słownictwa. Nawet jeśli nigdy nie uciekł, to jest we wszystkich listach słów ataku, ponieważ jest to oczywisty kandydat. "Paillon" może nie być w HiBP, ale jest to w francuskiej liście słów jakiegokolwiek poważnego narzędzia pękania.Te dwa przypadki odpowiadają atakom o innym charakterze, z różnymi prędkościami - i właśnie takie są modele Time2Crack.
4. Architektura nowoczesnego ataku słownika
4.1 Gazociąg ogólny
Nowoczesny atak słownika odbywa się w kilku fazach:
Phase 1 : Constitution de la wordlist
├── Mots de passe fuités (HIBP, RockYou, Collections)
├── Wordlists linguistiques (dictionnaires, prénoms, lieux)
├── Wordlists thématiques (sport, pop culture, tech, religion)
└── Wordlists contextuelles (domaine de l'entreprise cible, noms d'employés)
Faza 2: Wordlist Preprocessing
- Sortuj według częstotliwości (najprawdopodobniej najpierw)
- - Odliczanie (nie dwa razy ten sam kandydat)
- - filtracja długości (długość docelowa + ± 2)
- - Normalizacja (małe skrzynie, Unicode NFC)
Faza 3: Obliczanie haszów kandydackich
Dla każdego kandydata w liście słów:
Roszpunka warzywnakandydat = hashalgo (w)
Promocyjna reklama hashkandydat = = hashCel: USTALENIA
- Prędkość: 168 GH / s dla MD5 na RTX 4090
Faza 4: Analiza wyników
Sprawozdanie dotyczące pękniętych haseł, statystyki zasięgu
4.2 Optymalizacja sprzętu
Nowoczesne ataki słowników są bardzo podobne na GPU:
Dla słownika zawierającego 14 miliardów wpisów (rozmiar HIBP) na 12 × RTX 4090:
Ta różnica ~ 9 rzędów wielkości pomiędzy MD5 i bcrypt wyjaśnia, dlaczego wybór algorytmu haszu jest krytyczny.
4.3 Porządek testowy kandydatów
Lista słów nie jest testowana w porządku alfabetycznym - jest posortowane przez malejące prawdopodobieństwo :
Ten rodzaj zapewnia, że jeśli hasło jest "niskie", zostanie znalezione w pierwszych milisekundach - niezależnie od prędkości haszu.
5. Korpus prawdziwych haseł
5.1 Czy zostałem zaszczepiony (HIBP)
Rozmiar ~ 14 miliardów unikalnych haseł (2024) Źródło : agregacja przecieków publicznych od 2013 r. Format : SHA-1 posortowane według częstości występowania Dostęp publiczny : k- anonimowość API, pełne pobieranie haszu dostępne dla obrońcówHiBP jest globalnym punktem odniesienia, ponieważ:
Napastnik z kompletnym wysypiskiem HIBP może najpierw przetestować ~ 14 miliardów kandydatów w kolejności malejącej częstotliwości. Dla niesolonych algorytmów (MD5, SHA-1), ta lista obejmuje w kolejności 50- 70% wszystkich prawdziwych haseł online.
5.2 RockYou (2009) - Founding corpus
Rozmiar : 14.3 mln jasnych haseł Kluczowe cechy : WskaźnikHasłoZdarzenia% korpus Czy...- Tak.- Tak.- Tak. 1123456290 7312,03% 21234579 0780, 55% 312345678976 7900, 54% 4hasło59 4620, 42% 5Iloveyou49 9520, 35% Top 10-- 650,000- Top 100-~ 1 200 0008, 4% Top 1 000-~ 2 500 000~ 17,5% 10 000-- 4 500 000- 31,5% Edukacja Test tylko 10,000 kandydatów (100 μs MD5 prędkości) kompromisy ~ 31% bazy danych MD5 kont chronionych.5.3 Zbiory specjalistycznych list słów
Sektory (Daniel Miessler): kolekcja słów o wartości ~ 4 GB:Te korpusy są do publicznego pobrania - ich istnienie jest utrwalonym faktem ofensywnego bezpieczeństwa.
6. K- Weryfikacja anonimowości HIBP: Atak czasu rzeczywistego
6.1 Protokół k- anonimowość
Time2Crack zawiera kontrolę HIBP w czasie rzeczywistym, która odtwarza dokładnie to, co napastnik zrobiłby z bazą danych HIBP - ale nigdy nie przekazuje hasła w języku prostym lub jego pełnym haszu.
Protokół k- anonimowości działa następująco:
1. Calculer SHA-1(password) → par exemple "CBFDAC6008F9CAB4083784CBD1874F76618D2A97"
Wyślij tylko 5 pierwszych znaków do API HIBP: "CBFDA"
API zwraca wszystkie przyrostki SHA-1 zaczynając od "CBFDA" (około 400- 600 hash)
Szukaj lokalnie, jeśli reszta haszu ("C6008F9CAB4083784CBD1874F76618D2A97") znajduje się na liście
Jeśli znaleziono: hasło zostało naruszone (HIBP zwraca również liczbę przecieków)
Gwarancja poufności Serwer HIBP nigdy nie widzi pełnego haszu (więc nie może zidentyfikować hasła), nie mówiąc już o wyraźnym haśle. Ostateczne obliczenia są wykonywane lokalnie.
Co to oznacza dla ataku? : jeżeli HIBP zwraca dopasowanie z wysoką liczbą (np. 9547,236 ukazań dla "123456"), oznacza to, że napastnik z bazą danych HIBP testującą ten wskaźnik kredytowy znajdzie go w bardzo wysokiej pozycji na liście uporządkowanej według częstotliwości - w ułamku nanosekund.
6.2 Realizacja w Time2Crack (app.js)
Kontrola HIBP jest asynchroniczna i nieblokująca. Hasło jest natychmiast analizowane metodami lokalnymi, a kontrola HIBP kończy wynik:
// Pseudo-code simplifié
async function checkHIBP(password) {
const sha1 = await sha1Hash(password);
const prefix = sha1.substring(0, 5); // 5 premiers chars
const suffix = sha1.substring(5); // reste du hash
const response = hount fetch (
https://api.pwnedpasswords.com/range/${prefix}
);
linie const = oczekuj odpowiedzi .text ();
dla (const linii linii.split ('\ n')) {
const [hashSuffix, count] = line.split (":");
if (hashSuffix.toLowerCase () = suffix.toLowerCase ()) {
powrót parseInt (liczba); / / liczba wycieków
¶
¶
powrót 0; / / nie znaleziono
¶
Dane dotyczące działania HIBP :
6.3 Interpretacja Hrabiego HIBP
Liczba zwrócona przez HiBP wskazuje liczbę razy to dokładne hasło pojawiło się w indeksowanych przeciekach:
LiczInterpretacjaCzas pęknięcia (MD5, 12 × RTX 4090) Więc...{C: $aaccff} Tłumaczenie:- Nie. > 1 000 000Top 100 Świat< 1 nanosekunda 10,000-1,000,000Bardzo często< 10 nanosekund 1 000-10 000Często< 100 nanosekund 100- 1000Niezbyt często, ale znane< 1 mikrosekundy 1- 100Rzadkie, ale zagrożone< 10 mikrosekundNawet liczba 1 (hasło pojawiło się tylko raz w przecieku) wskazuje na podatność: jeśli napastnik celuje w to konto specjalnie i ma listę referencji danego przecieku, znajdzie je.
7. Time2Crack Język Wordlist
7.1 Dlaczego listy słów oprócz HIBP
HiBP obejmuje dokładne poświadczenia kompromisowe - ale nie zwykłe słowa nigdy nie uciec jeszcze. Użytkownik frankofonu, który wybiera "efemeryczne" jako hasło może nie być w HiBP (słowo jest mało prawdopodobne w referencjach anglofonu), ale znajduje się na francuskiej liście słów każdego napastnika celem systemu frankofonu.
Lista słów Time2Crack obejmuje tę lukę:
JęzykŹródłoSzacunkowa wielkość Bo...Bo...{C: $aaccff} Tłumaczenie: AngielskiSecLists Wikipedia PL200,000 wpisów Francuski (fr)SecLists Wikipedia PL- 150 000 wpisów HiszpańskiSecLists Wikipedia ES- 150 000 wpisów Portugalski (pt)SecLists Wikipedia PT- 120 000 wpisów NiemieckiSecLists Wikipedia DE- 180 000 wpisów Turecki (tr)SecLists Wikipedia TR100 000 wpisów Włoski (it)kkrypt0nn100 000 wpisów Polski (pl)kkrypt0nn~ 80 000 wpisów Niderlandy (nl)kkrypt0nn~ 80 000 wpisów Zastosowanie filtra Zachowuje się tylko słowa o ≥ 4 znakach (znaki 1-3 są zbyt krótkie, aby były realistycznym hasłem, a ich włączenie zwiększyłoby listę bez wartości dodanej).7.2 Ładunek leniwy
Listy wordlist nie są zawarte w kodzie - są ładowane na życzenie przy zmianie języka, aby spełnić budżet sieci:
// app.js - loadDictionary()
async function loadDictionary(lang) {
if (DICTlang & DICTWORDS) return; // Déjà chargé
if (DICT/
DICTPENDINGLANG = lang; / / oczekujący plik
powrót;
¶
DICTLOADING = true;
const res = czekać fetch (data/wordlists/${lang}.txt);
const text = wait res.text ();
/ / Convert to Set < string > for O (1) lookup
DICTWORDS = nowy zestaw (
text.split ("\ n")
.map (w = > w.normalize ("NFC") .trim () .toLowerCase ())
.filter (w = > w.długość > = 4)
);
DICTLANG = Lang;
DICTLOADING = false;
¶
Dlaczego Set ? Struktura Set JavaScript gwarantuje O (1) przeglądanie - niezależnie od rozmiaru słownika (50 000 lub 200 000 wpisów), weryfikacja DICTWORDS.has(word) ma ten sam stały czas. Array wymagałoby O (n) na kontrolę, tj. do 200 000 porównań na kontrolę.
Wczytywanie kolejki
W DICTPRACALANG unika warunków wyścigu podczas szybkich zmian językowych:
Scénario : l'utilisateur switche rapidement EN → FR → DE
├── EN demandé : DICTLOADING = false → początek pobierania PL
FR wymagane podczas pobierania EN: DICTLOADING = true → DICTPRACALANG = "fr"
├── DE demandé pendant fetch EN : DICTLOADING = prawdziwe → DICTPENDINGLANG = "de" (crash "fr")
- Fetch Ends: DICTLANG = "en", puis lance loadDictionary("de")
└── Résultat : seule la dernière langue demandée est chargée
Zachowanie to jest zamierzone: ostatnio wymagany język jest załadowany, nie wszystkie języki pośrednie.
8. Wykrywanie słownika w Time2Crack: isDictWord()
8.1. Operacja wykrywania
Funkcja isDictWord(pw) określa, czy hasło pochodzi z bieżącego słownika:
// app.js - ligne 2181
function isDictWord(pw) {
if (!DICT(WORDS) zwrot fałszywy;
/ / Normalizacja: NFC + Niska skrzynia
const l = pw.normalize ("NFC") .toLowerCase ();
/ / Bezpośrednia weryfikacja
jeśli (DICT)
WORDS.has(l) || DICTWORDS.has (deLeet (pw)) return true;
/ / Zmiany morfologiczne
const deleetWord = deLeet (pw);
zmienności const = getMorphVariations (deleetWord);
dla (const variation of variations) {
jeśli (DICT)
WORDS.has(variation)) return true;
}
zwrot fałszywy;
¶
Linia detekcji 3 warstw :
8.2 Normalizacja jednorodna (NFC)
Normalizacja normalize("NFC") zapewnia, że znaki akcentowane są traktowane konsekwentnie:
Normalizacja ta jest stosowana zarówno przy tworzeniu słownika, jak i przy sprawdzaniu - zapewniając prawidłową korespondencję dla języków akcentu (FR, ES, DE, PT itp.).
8.3 Wpływ na wykrytą podatność na zagrożenia
Kiedy isDictWord() Wracaj. truestosuje się kilka ataków:
hybridVuln = true → 1000 mutacji testowanych na bazie słownika9. Odleetyfikacja: jak atakujący dekoduje substytucje
9.1 Leetspeak i jego ograniczenia jako ochrona
Leetspeak (lub "1337 mowy") jest praktyką zastępowania liter podobnymi numerami lub symbolami wizualnymi: a→@, e→3, i→1 lub !, o→0, s→$Użytkownicy używają go do "wzmocnienia" wspólnych słów.
Rzeczywistość: te substytucje są stosowane pierwsze zasady Nie stanowią prawdziwej obrony przed kompetentnym napastnikiem.
9.2 Wdrożenie deLeet() w Time2Crack
// app.js - ligne 3622
const LEETBASE = {
a: ["@", "4"],
e: ["3"],
o: ["0"],
s: ["$", "5"],
t: ["+", "7"],
h: ["#"]
g: ["9"],
!
funkcja LeetWith (pw, oneMap) {
let r = pw.normalize ("NFC") .toLowerCase ();
dla (const [ch, reps] obiektów (LEET)
BASE))
for (const c of reps) r = r.split(c).join(ch);
// Appliquer la résolution ambiguë (i ou l) en dernier
for (const [ch, reps] of Object.entries(oneMap))
for (const c of reps) r = r.split(c).join(ch);
return r;
}
funkcja leet (pw) {
/ / Niepewność: "1" może być "i" lub "l"
const with I = deLeetWith (pw, {i: "1!", l: "});
const with L = deLeetWith (pw, {l: "1", i: "!"});
/ / Jeśli słownik jest wczytany, preferuj wariant, który pasuje
jeśli (DICT)SŁOWA)
jeśli (DICT)WORDS.has (with L)) return with L;
jeśli (DICT)WORDS.has (with I) return with I;
¶
/ / W przeciwnym razie: preferuj wariant z najmniejszą pozostałą liczbą
const digestsI = (with I.match (/\ d / g)
const digestsL = (with L.match (/\ d / g)
cyfra zwrotna L < = cyfra I? z L: z I;
¶
9.3 Zarządzanie wszechstronnością "1" → "i" lub "l"
Zastępstwo "1" jest dwuznaczne: "1" może reprezentować "i" (jak w "1nfo" → "info") lub "l" (jak w "p1ayer" → "gracz"). Time2Crack rozwiązuje tę dwuznaczność poprzez:
9.4 Zastępstwa nieobjęte (celowo)
Time2Crack nie obejmuje rzadkich lub niejednoznacznych substytucji poza wzorami LEETBASE. Jest to wybór projektu: pokrycie zbyt wielu przypadków zwiększyłoby fałszywe pozytywne (wykrywanie hasła jako "aktualnego słowa", podczas gdy nie jest). Uwzględnione wzorce obejmują > 95% rzeczywistej leetications obserwowane w korpusie.
10. Obliczanie czasu pękania: addDictionaryAttacks()
Logika obliczania
// app.js - ligne 3848
function addDictionaryAttacks(rows, common, weak, dictWord) {
for (const a of ALGOS) {
let sec;
if (weak) sec = 100 / a.rate; // Top ~100 entrées
else if (common) sec = 10000 / a.rate; // HIBP priority list ~10k
else if (dictWord) sec = 200000 / a.rate; // Scan wordlist complète ~200k mots
else sec = null; // Non applicable
const note = słaby? t ("nWeakPassword")
("nInLeaks")
: dictWord? t (nDictHit)
: t (nAbsentLeaks);
rows.push ({atk: t ("aDict"), hash: a.name, śledziona: a.rate, sec, note, cat: "dict"};
¶
¶
10.2 Trzy poziomy wrażliwości
Poziom 1 - Uszkodzenie (weak = true): ~ 100 / śledziona
Hasło znajduje się w Top 100 na świecie ("hasło", "123456", "qwerty"...). Napastnik testujący te 100 priorytetowych kandydatów znajduje go w pierwszym przejściu. 0, 6 nanosekundu.
Poziom 2 - często (common = true): ~ 10 000 / śledziona
Hasło znajduje się w referencyjnej liście HIBP ~ 10 000 najczęściej haseł. Kandydaci są testowani w pierwszych mikrosekundach. 59 nanosekund.
Poziom 3 - DictWord (dictWord = true): ~ 200,000 / śledziona
Hasło jest słowem z obecnego słownika językowego (lokalna lista słów ~ 50k- 200k). Kompletny skan listy słów jest niemal natychmiastowy dla szybkich algorytmów. Dla MD5: 200 000 / 168,9e9 1,18 mikrosekundy.
Poziom 4 - Nie dotyczy (sec = null): hasło nie jest ani ultrasłabe, ani powszechne, ani słowo z obecnego słownika. Sam atak słownika nie ma zastosowania - inne ataki (siła brutto, Markov, PCFG) stają się głównym zagrożeniem.
10.3 Dlaczego te liczby (100, 10 000, 200 000)?
Wartości te są skalibrowane na rzeczywiste dane:
10.4 Kompletny przykład numeryczny
Hasło "słońce" (obecne francuskie słowo, wykryte jako dictWord):
Nawet dla Argon2id, 250 sekund to mniej niż 5 minut - za proste słowo z francuskiego słownika.
11. Wysoka kalibracja wierności: applyHighFidelityCalibration()
11.1 Dlaczego dodatkowa kalibracja?
Obliczenie brutto addDictionaryAttacks() daje oszacowanie "najgorszego przypadku" - tak jakby napastnik testował jednolicie całą listę słów. według prawdopodobieństwa : najczęstsze hasła są najpierw.
Wysoka kalibracja wierności stosuje mnożnik korekcyjny na podstawie obserwacji empirycznych:
// app.js - ligne 4442
case "dict":
// Ur et al. 2012 : mots communs trouvés dans les 100-10k premiers essais
// Weir 2009 : mots dict trouvés dans les 200k premiers essais (scan ordonné)
m = context.common? 0.15: context.dicWord? 0.5: 1.0;
Przerwa;
Mnożnik common (0, 15) : jeśli hasło znajduje się na wspólnej liście priorytetów, znajduje się ono średnio w 15. percentylu listy - czyli ~ 1500 testów z 10.000 wymienionych na liście. Czas mnoży się przez 0.15 → 6.7 × szybciej niż jednolity skan.
Mnożnik dictWord (0, 5) : wspólne słowo słownika znajduje się na średnim semestrze dobrze uporządkowanej listy. Mnożnik 0.5 → 2 × szybciej niż jednolity skanowanie.
11.2 Źródła kalibracji akademickiej
12. Prawdopodobieństwo zastosowania i stopień ufności
12.1 System punktowy
Time2Crack nie tylko oblicza czas - ocenia również prawdopodobieństwo, że atak słownika jest rzeczywiście najszybszym atakiem, poprzez wieloczynnikowy system punktacji:
// Score d'applicabilité (0-1)
case "dict":
return context.common ? 0.99 : context.dictWord ? 0.85 : 0;
common Hasło jest w HIBP → atak słownika stosuje się z maksymalną pewnością.dictWord Tylko: wysokie prawdopodobieństwo. Słownik słowo jest wrażliwe, ale napastnik musi mieć odpowiednią listę słów językowych.12.2 Wynik dowodowy
Równolegle z punktacją stosowalności "dowody" rejestrują obserwowane sygnały:
case "dict":
return Number(!!context.common) + Number(!!context.dictWord);
// 0 : aucun signal
// 1 : un signal (common OU dictWord)
// 2 : deux signaux (common ET dictWord)
Wynik dowodowy 2 (słowo w HIBP i słowniku językowym) zwiększa ostateczne zaufanie 0,08 (2 × 0,04).
12.3 Ostateczna ocena zaufania
const base = confidenceBase["dict"] || 0.6; // confiance de base
const evidenceBoost = Math.min(0.12, row.evidenceScore 0.04);
const speculativePenalty = speculativeCats.has("dict") ? 0.08 : 0; // dict n'est pas spéculatif
row.confidence = Math.max (0, Math.min (1,
Math.max (możliwość zastosowania, podstawa) + dowód Boost - specyficzna kara
);
Hasło common z dictWord wykryto również:
applicability = 0.99evidenceBoost = min(0.12, 2 × 0.04) = 0.08confidence = min(1, max(0.99, 0.6) + 0.08) = min(1, 1.07) = 1.0Maksymalna pewność: Atak słownika jest pierwszym atakiem jednoznacznie.
13. Filtr Bloom RockYou: lokalna detekcja powszechnych haseł
13.1 Kontekst
Oprócz weryfikacji HIBP (która wymaga połączenia sieciowego) Time2Crack zawiera filtr rozkwitu Filtr bloom jest probabilistyczną strukturą danych, która pozwala na testowanie przynależności do zestawu z prawdopodobieństwem fałszywie dodatnich (~ 1%), bez przechowywania samych elementów.
13.2 Korzyści z filtra rozkwitu
KryteriaHiBP k- anonimowośćFiltr Bloom lokalny Czy...{C: $aaccff} Tłumaczenie:Więc... Zakres14 miliardów- 14 milionów. Opóźnienie50- 200 ms (sieć)< 1 ms (lokalny) Poufnośćk- anonimowość (5 zbiorników SHA-1)100% lokalne, nic transmitowane Fałszywy wynik0%- 1% RozmiarAPI~ 2- 5 MB (bloom filter binarny)13.3 Działanie podwójnego rozłupywania
// app.js - ligne 1962
function bloomHas(filter, word) {
if (!filter) return false;
const { bitArray, m, k } = filter;
const w = word.toLowerCase();
/ / Double- hashing: h1 i h2 to dwie niezależne funkcje haszu
const h1 = fnv1a32 (w, 2166136261); / / FNV1a ze standardowym materiałem siewnym
const h2 = fnv1a32 (w, 0x811c9dc5); / / FNV1a z alternatywnym materiałem siewnym
dla (niech i = 0; i < k; i + +) {
const pos = (h1 + (i) (h2) > > > (0))% m; / / k pozycji w tablicy bitów
const byteIdx = Math.floor (pos / 8);
const bitIdx = pos% 8;
/ / Jeśli bit jest 0: słowo jest nieobecne
jeżeli ((bitArray [byteIdx] & (1 < < bitIdx)) = 0) zwraca false;
¶
/ / Wszystkie bity są na 1: słowo jest PROBABLY obecny (z 1% FP)
zwrot true;
¶
FNV1a-hashing zapewnia jednolity rozkład pozycji w tablicy bitowej, minimalizując kolizje i utrzymując wskaźnik fałszywie dodatni blisko 1%.
13.4 Format załadowczy i binarny
Filtr kwitnący jest przechowywany w data/rockyou.bloom - plik binarny z:
Obciążenie jest uruchamiane ręcznie przez użytkownika (przycisk w UI), nie automatycznie przy załadowaniu strony - aby zachować początkową wydajność.
14. Porównanie z atakami pochodnymi
"Czysty" atak słownika jest pierwszym z rodziny ataków, które wszystkie mają wspólny root: leksykalna lista słów. Time2Crack wdraża 7 modeli offline crack (siła brutto, słownik, hybryda, maska, PCFG, Markov, combinator), każdy atakuje hasło pod innym kątem.
14.1 Słownik vs Hybrid
KryteriaSłownikHybryda (dyct + rules) Czy...- Tak.Czy... KandydaciSłownik Słowa jakoSłowa + ~ 1000 mutacji na słowo Klawiatura200 000 kandydatów- 200 milionów kandydatów Pęknięte przykłady"hasło", "słońce"P @ ssw0rd!, s0l3il2024 Prędkość względna1000 × szybciejZnacznie szerszy zakres Stosuje się, jeżelidokładne słowo w liścieHasło pochodzące ze słownikaAtak hybrydowy rozpoczyna się tam, gdzie kończy się czysty słownik: bierze każde słowo z listy słów i stosuje systematyczne zasady mutacji (hashcat "best64.rule" na myśli).
14.2 Dictionary vs PCFG
KryteriaSłownikPCFG Czy...- Tak.Czy... WzórStała lista kandydatówGramatyka struktury probabilistycznej MocDokładne słowaWord + Digits struktury, Cap + niższe + sym Przykład"hasło" →"Password123" → ZakresZnane słownictwoOgólne struktury ludzkieHasło takie jak "Password123" może być niezauważone w słowniku (dokładne słowo "Password123" może nie być wymienione), ale zostanie bardzo szybko złamana przez PCFG, który rozpoznaje strukturę [Majuskule] [minuskuły] [cyfry].
14.3 Słownik vs Markov
KryteriaSłownikMarkov Przewodniczący Czy...- Tak.Bo... KandydaciLista wstępnie skompilowanaPlik wygenerowany przez model statystyczny ZakresZnane słownictwoKażda prawdopodobna sekwencja "człowieka" KorzyśćBardzo szybko na dokładne słowaObejmuje nieznane słowa słownictwa Przykład"słoneczny" →"sunsh1ne" potencjalnieMarkov zajmuje się sprawami, w których hasło wygląda jak ludzkie słowo, nie będąc na żadnej liście.
14.4 Dictionary vs Credential farshing
KryteriaSłownikWypychanie kredytu Czy...- Tak.- Tak. CelŁamanie haszuSprawdź konkretny logowanie MechanizmLokalne obliczenia haszowePróby zdalnego połączenia ŹródłoOgólna lista słówPara wycieków logowania / hasła ObronaSilny algorytm haszuOgraniczenie stawki, MFA, blokowanie IPUfarbowanie kredowe nie atakuje haszu - bezpośrednio próbuje par logowania / hasła na zdalnych usługach. Pojęcie różni się od pęknięcia, ale posiada to samo źródło danych (HIBP / fail).
15. Ograniczenia słownika ataku
15. 1 Wartości graniczne wewnątrz
1. Tylko znane słownictwo Wynalezione hasło, które nie przypomina żadnego istniejącego słowa i nie znajduje się w HiBP, nie jest odporne na czysty atak słownika. "Xqz7mK9pL" nigdy nie będzie w żadnej liście słów. 2. Zasięg językowy Napastnik celujący w użytkownika francuskojęzycznego bez francuskiej listy słów pominie słowa takie jak "efemeral", "grenouille" lub "bricolage", które nie znajdują się w standardowych angielskich listach słów. 3. Nowe hasła Wiarygodny, który został stworzony i nigdy nie uciekł nie będzie w HiBP - nawet jeśli jest bardzo powszechne, będzie musiał poczekać do następnego przecieku, aby go znaleźć. 4. Bardzo długie hasła Hasło składające się z długo wymyślonej frazy ("MaGrandeAventure2024SousLesEtoiles") nie będzie w liście słów - nawet jeśli każde słowo wzięte oddzielnie jest trywialne. Jest to idea za passphrases, traktowane przez inne ataki (Combinator, PRINCE).15.2 Jakie obliczenia Time2Crack nie model
Context Wordlist : atakujący skierowany do określonego sektora buduje dostosowane listy słów (terminy medyczne dla szpitali, slang gier wideo dla platform gier). Time2Crack używa ogólnych list słów. Połączone siły brutto Wordlist : Narzędzia takie jak CeWL (Custom Word List Generator) mogą pobierać terminy ze strony docelowej, aby zbudować własną listę słów. Ostatnie przecieki jeszcze nie w HIBP między chwilą przecieku a jego włączeniem do HIBP, naruszone referencje krążą na forach prywatnych bez dostępu za pośrednictwem publicznego API. Algorytmy haszowe nieobjęte Modele Time2Crack 6 algorytmów (MD5, SHA-1, SHA- 256, NTLM, bcrypt, Argon2id). Algorytmy takie jak SHA- 512, scrypt lub PBKDF2 mają różne profile.16. Skuteczna obrona
16.1 Co chroni przed atakiem słownika
Nowoczesny algorytm haszu (bcrypt, Argon2id) To najbardziej skuteczna obrona po stronie serwera.Różnica 10 + rzędu wielkości między MD5 i Argon2id sprawia, że hasło słownika "słońce" jest w praktyce odporny, jeśli jest chronione przez Argon2id - nawet jeśli napastnik wie, że jest to francuskie słowo.
Pojedyncza sól na konto Sól zapobiega wcześniej obliczonym atakom stołowym i zmusza napastnika do przeliczania indywidualnie dla każdego konta. Nie chroni ukierunkowanych ataków na listę słów (napastnik może jeszcze przetestować 200 000 słów za pomocą soli), ale unieważnia stoły tęczy i sprawia, że masowe ataki na duże bazy danych są niewykonalne. Długość hasła Hasło jednego słownika (8- 10 znaków) jest wrażliwe. Passsphrase 4- 5 słów ("cheval- lumière- leśna podróż") jest odporny na atak czystego słownika, ale nie na atak Kombinatora - stąd znaczenie długości i losowości. Losowo wygenerowane hasła Prawdziwe rozwiązanie: użyj menedżera haseł, który generuje długie przypadkowe hasła (20 + znaki wszystkich typów). Te hasła nigdy nie będą w żadnym słowniku. uwierzytelnianie wieloczynnikowe (MFA) MFA nie zapobiega crack offline (napastnik odzyskuje hashy i pęknięcia offline), ale chroni przed creditial farshing (używać pęknięte referencje do połączenia). Ograniczanie i wykrywanie anomalii Chroni przed atakami online (próby bezpośredniego połączenia), a nie przed offline kradzieżą skradzionych haszów.16. 2 Czego nie chroni
Proste substytucje leetów : "haslo" → "p @ ssw0rd" - patrz punkt 9. Dodano numery na końcu : "password" → "password1" - wśród pierwszych sprawdzonych zasad. Płatność początkowa : "hasło" → "Hasło" - standardowa zasada kapitalizacji. Rysunki i symbole, jeśli słowo pozostaje rozpoznawalne "słońce!" jest na każdej liście słów, która zawiera "słońce" z podstawowymi zasadami. Kompleksowość narzucona bez długości "P @ s1w" spełnia kryteria złożoności (maj, min, liczba, symbol), ale jest krótsza i bardziej przewidywalna niż "correcthorsebateryficture".16.3 Zalecenia praktyczne
17. Referencje
Źródła pierwotne (studia akademickie)
Morris, R., & Thompson, K. (1979). Bezpieczeństwo haseł: Historia spraw. Komunikaty ACM, 22 (11), 594- 597.common ? 0.15 (górny poziom 10k)Źródła przemysłowe
Zostałam wrobiona. (2024). Pwned Passwords. https: / / havibeenpwned.com / PasswordsŹródła wtórne (kontekst)
Troy Hunt. (2013). Wprowadzenie 306 Mln Wolny do pobrania Pwned Hasła. troyhunt.com.Źródła internetowe cytowane w aplikacji Time2Crack
IEEE Xplore (odniesienie dykcyjne). https: / / ieeexplore.ieee.org / document / 6234435descDict (app.js) dla kolejności pokrycia najlepszych słowników.Dokument wygenerowany dla Time2Crack Project - Wersja 1.0 - 2026- 04- 01 Kod źródła:
app.js (funkcje addDictionaryAttacks, isDictWord, deLeet, loadDictionary, applyHighFidelityCalibration, bloomHas) *