Angriff auf das Wörterbuch — Umfassende Operation
Referenzdokument des ProjektsTime2Crack
Empfänger: Entwickler, Sicherheitswissenschaftler, Fortgeschrittene
Inhalt
isDictWord()addDictionaryAttacks()applyHighFidelityCalibration()1. Überblick
Der Angriff auf das Wörterbuch ist die älteste Passwort-Cracking-Methode, die einfachste konzeptionell und statistisch am effektivsten auf die Mehrheit der realen menschlichen Passwörter. Sein Prinzip ist, in absteigender Reihenfolge der Wahrscheinlichkeit eine vorkompilierte Liste der Kandidaten zu testen — das "diktionäre" — anstatt alle möglichen Kombinationen, wie die Rohkraft tut, vollständig aufzuzählen.
Warum es schrecklich effektiv ist Die Dekaden von Datenlecks zeigen, dass die tatsächliche Verteilung von Passwörtern extrem konzentriert ist: die häufigsten 1.000 Passwörter repräsentieren etwa 5 bis 10% aller Online-Konten. Die häufigsten 1 Million Cover 40 bis 60%. Ein gut gebauter Wörterbuch-Angriff wird diese Kandidaten in Millisekunden bis Sekunden testen – wo die Bruttokraft Millionen von Jahren dauern würde.InTime2CrackDer Wörterbuchangriff modelliert zwei verschiedene, aber komplementäre Mechanismen:
Diese beiden Erkennungen sind unabhängig und komplementär: HiBP deckt die genauen Kompromiss-Anmeldeinformationen ab, die Wordlist deckt die gemeinsamen Wörter noch nicht aus.
2. Historischer und akademischer Hintergrund
2.1 Ursprung
Die ersten Unix-Systeme haben Passwörter in der Sprache in der Sprache gespeichert /etc/passwd, so dass jedes Wörterbuch-Angriff trivial, sobald die Datei zugänglich war.
2.2 Gründung von Lecks
Einige Lecks haben die Landschaft des Angriffs durch Wörterbuch verändert, indem sie die tatsächliche Verteilung der menschlichen Passwörter zeigen:
RockYou (2009) Ein Entwickler hatte 14,3 Millionen Passwörter in einfacher Sprache gespeichert.- Passwort #1 ("123456") repräsentiert 290,731 Konten (2%)
2.3 Referenz Benchmarks für Wörterbuch-Angriff
Eine Wortliste von 200.000 Einträgen, die mit der Geschwindigkeit eines RTX 4090 getestet wurden:
AlgorithmenGeschwindigkeitZeit für 200k Kandidaten --------------------------------------- MD5168,9 GH/s~1,2 nanosecond ~ SHA-150.86 GH/s~3,9 Nanosekunden SHA-25622.68 GH/s~8.8 Nanosekunden NT2 ARBEITSLOSIGKEIT288.5 GH/s~0,7 Nanosekunde bcrypt (Kosten 5)184 kH/s~1.09 second Argon2id~67 H/s~50 minutesDer Wörterbuch-Angriff ist daher für MD5, SHA-1 und NTLM fast augenblicklich – und bleibt auch für Bcrypt auf kleinen Listen sehr schnell.
3. Konzeptionelle Grundlagen: warum Wörterbücher funktionieren
3.1 Das Machtrecht der menschlichen Passwörter
Alle empirischen Studien konvergieren sich zur gleichen Beobachtung: die Verteilung menschlicher Passwörter ist nicht gleichförmig — es folgt einer Gesetz der Macht (Zipf). Einige Passwörter konzentrieren sich auf einen unverhältnismäßigen Teil der Wahlen.
Formal : wenn alle Passwörter durch abnehmende Frequenz klassifiziert werden, die Frequenz des Rang-Passworts R ist proportional zu (-α) mit α 1,5 bis 2 Laut dem Korpus.Direkte Folge: 10 häufigste Passwörter Ein Angreifer, der nur 10 Kandidaten testet, hat bereits in 20 Jahren die Chance, erfolgreich zu sein – statistisch gesehen ist es riesig für die Menge an Lärm erzeugt.
3.2 Kognitive Bias in der Passwort-Erstellung
Menschen wählen nicht zufällig aus. Sie verwenden systematisch Heuristiken, die ihre Passwörter vorhersehbar machen:
3.3 Das Konzept des "Passworts bereits in den Listen"
Ein Passwort kann aus zwei verschiedenen Gründen in einer Angriffsliste sein:
Grund 1 — Er ist in HIBP Der Angreifer muss sich nicht erraten – er testet die bekannten Anmeldeinformationen von einem nach dem anderen, um die Frequenz zu bestimmen. Grund 2 — Es ist in einer sprachlichen Wortliste Das Passwort ist ein gewöhnliches Wort des üblichen Vokabulars. Auch wenn es nie geflohen ist, ist es in allen angreifenden Wortlisten, weil es ein offensichtlicher Kandidat ist. "Paillon" kann nicht in HiBP sein, aber es ist in der französischen Wortliste eines ernsthaften Cracking-Tools.Diese beiden Fälle entsprechen den Angriffen anderer Natur, mit unterschiedlichen Geschwindigkeiten — und das ist, wasTime2CrackModelle genau.
4. Architektur eines modernen Wörterbuch-Angriffs
4.1 Allgemeine Pipeline
Ein moderner Wörterbuchangriff findet in mehreren Phasen statt:
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)
Phase 2: Wordlist Vorverarbeitung
- Sortieren nach Häufigkeit (meist wahrscheinlich zuerst)
- Deduplizierung (nicht zweimal der gleiche Kandidat)
- - Längenfiltration (Ziellänge + ±2)
- Standardisierung (kleiner, Unicode NFC)
Phase 3: Berechnung der Kandidat Hashs
Für jeden Kandidaten w in der Wortliste:
Ψ hashBewerber = HashAlgo(w)
WerbeartikelBewerber = hashZiel : FINDED
- Geschwindigkeit: 168 GH/s für MD5 auf RTX 4090
Phase 4: Analyse der Ergebnisse
Bericht über geknackte Passwörter, Berichterstattungsstatistik
4.2 Hardwareoptimierungen
Moderne Wörterbuch-Angriffe sind massiv parallel zu GPU:
Für eine Wortliste von 14 Milliarden Einträgen (HIBP-Größe) auf 12× RTX 4090:
Dieser Unterschied von ~9 Größenordnungen zwischen MD5 und bcrypt erklärt, warum die Wahl des Hash-Algorithmus kritisch ist.
4.3 Prüfauftrag der Kandidaten
Die Wortliste wird nicht in alphabetischer Reihenfolge geprüft — sie ist sortiert nach abnehmender Wahrscheinlichkeit :
Diese Art sorgt dafür, dass, wenn das Passwort "low" ist, es in den ersten Millisekunden gefunden wird - was auch immer die Hash-Geschwindigkeit.
5. Die Korpus der echten Passwörter
5.1 Habe ich Pwned (HIBP)
Größe ~14 Milliarden einzigartige Passwörter (2024) Quelle : Aggregation von öffentlichen Lecks seit 2013 Format : SHA-1 sortiert nach Erscheinungsrhythmus Öffentlicher Zugang : k-Anonymität API, volle Hash-Download für VerteidigerHiBP ist die globale Referenz, weil:
Ein Angreifer mit dem kompletten HIBP-Dump kann zunächst die ~14 Milliarden Kandidaten in absteigender Reihenfolge der Frequenz testen. Für nicht gesaltete Algorithmen (MD5, SHA-1), umfasst diese Liste in der Größenordnung von 50-70% aller realen Online-Passwörter.
5.2 RockYou (2009) — Gründung corpus
Größe : 14,3 Millionen klare Passwörter Hauptmerkmale : RangPasswort vergessen?Umstände% des Korpus ------------------------------------- 1123456290 7312,03% 2.ANHANG79 0780,55 % 312345678976 7900,54% ANHANGPasswort vergessen?59 4620,42 % 5.Ich liebe dichANHANG0,35 % Top 10—~650,000~4.5% ~ Top 100—~1 200 000~8.4% ~ 1 000—~2 500 000 ~~17.5% ~ 10.000—~4 500 000~31.5% ~ Bildung Testen Sie nur 10.000 Kandidaten (100 μs MD5 Geschwindigkeit) Kompromisse ~31% einer Datenbank von MD5-geschützten Konten.5.3 Sammlungen von spezialisierten Wortlisten
Sekundarbereich (Daniel Miessler): Open-Source-Sammlung von ~4 GB-WortlistenDiese Korpusen sind öffentlich herunterladbar — ihre Existenz ist eine etablierte Tatsache der Offensive Sicherheit.
6. K-Anonymität Verification HIBP: Ein Echtzeit-Angriff
6.1 Protokoll k-Anonymität
Time2Crackintegriert einen Echtzeit-HIBP-Check, der genau das reproduziert, was ein Angreifer mit der HIBP-Datenbank tun würde – aber niemals das Passwort in der einfachen Sprache oder in der vollen Hash übertragen würde.
Das k-Anonymitätsprotokoll funktioniert wie folgt:
1. Calculer SHA-1(password) → par exemple "CBFDAC6008F9CAB4083784CBD1874F76618D2A97"
Senden Sie nur die ersten 5 Zeichen an die HIBP API: "CBFDA"
Die API liefert ALLE SHA-1 Suffixes ab "CBFDA" (etwa 400-600 Hashes)
Suchen Sie lokal, ob der Rest der Hash ("C6008F9CAB4083784CBD1874F76618D2A97") in der Liste
Wenn gefunden: Passwort wurde beeinträchtigt (HIBP gibt auch die Anzahl der Lecks zurück)
Gewährleistung der Vertraulichkeit Der HIBP-Server sieht nie den kompletten Hash (so kann er das Passwort nicht identifizieren), geschweige denn das klare Passwort. Die endgültige Berechnung erfolgt lokal.
Was das für ein Angriff bedeutet : wenn HIBP eine Übereinstimmung mit einer hohen Anzahl zurückgibt (z.B. 9,547,236 Auftritte für "123456"), bedeutet dies, dass ein Angreifer mit der HIBP-Datenbank, der dieses Anmeldeinformationen testet, ihn in einer sehr hohen Position auf seiner nach Häufigkeit sortierten Liste in einem Bruchteil von Nanosekunden finden würde.
6.2 Implementierung inTime2Crack(app.js)
Die HIBP-Überprüfung ist asynchron und nicht blockierend. Das Passwort wird sofort nach lokalen Methoden analysiert und die HIBP-Überprüfung beendet das Ergebnis:
// 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 = Warteruf(
https://api.pwnedpasswords.com/range/${prefix}
;
const lines = Antwort erwarten.text();
für (const line of lines.split('\n') {
const [hashSuffix, count] = line.split(':');
wenn (hashSuffix.toLowerCase() = suffix.toLowerCase())
zurück parseInt(count); // Anzahl der Lecks
}
}
zurück 0; // nicht gefunden
}
HIBP Leistungsdaten :
6.3 Interpretation des Zählers HIBP
Die von HiBP zurückgegebene Anzahl gibt an, wie oft dieses genaue Passwort in indexierten Lecks erschien:
AnzahlAuslegungCrackzeit (MD5, 12× RTX 4090) ------------------------------ 1 000Top 100 Welt< 1 Nanosekunden 10.000–1,000.000Sehr häufig< 10 Nanosekunden 1 000 bis 10 000Gemeinsame< 100 Nanosekunden 100-1000Ungewöhnlich, aber bekannt< 1 Mikrosekunden 1–100Selten, aber kompromittiert< 10 MikrosekundenAuch eine Anzahl von 1 (das Passwort erschien nur einmal in einem Leck) zeigt eine Schwachstelle: Wenn ein Angreifer dieses Konto gezielt anspricht und die Liste der Anmeldeinformationen des betreffenden Lecks hat, wird er es finden.
7. SprachwörterlistenTime2Crack
7.1 Warum Sprachwortlisten zusätzlich zu HIBP
HiBP deckt die genauen Kompromissberechtigungen ab – aber nicht die gemeinsamen Wörter laufen noch nie weg. Ein Francophone-Nutzer, der "ephemeral" als Passwort wählt, kann nicht in HiBP sein (das Wort ist unwahrscheinlich in anglophone Anmeldeinformationen), aber es ist in der französischen Wortliste eines Angreifers, der ein Francophonsystem anstrebt.
Sprachwörterlisten vonTime2Crackdiese Lücke abdecken:
SpracheQuelleGeschätzte Größe ------------------------ EnglischSecLists Wikipedia DE~200.000 Einträge Französisch (fr)SecLists Wikipedia DE~150.000 Einträge SpanischSecLists Wikipedia ES~150.000 Einträge Portugiesisch (pt)SecLists Wikipedia PT~120.000 Einträge DeutschSecLists Wikipedia DE~180.000 Einträge Türkisch (tr)SecLists Wikipedia TR~100.000 Einträge Italienisch (it)kkrypt0nn~100.000 Einträge Polnisch (pl)kkrypt0nn~80 000 Einträge Niederlande (nl)kkrypt0nn~80 000 Einträge Anwendung der Filter Nur Wörter von ≥ 4 Zeichen werden beibehalten (die 1–3 Zeichen sind zu kurz, um ein realistisches Passwort zu sein, und ihre Aufnahme würde die Liste ohne Mehrwert aufblasen).7.2 Lazy Belastung
Wordlisten sind nicht im Code enthalten — sie werden auf Anfrage beim Wechsel der Sprache geladen, um den Netzbudget zu erfüllen:
// app.js - loadDictionary()
async function loadDictionary(lang) {
if (DICTLang & DICTWORDS) return; // Déjà chargé
if (DICT(LACHT)
DIKTPENDINGLANG = lang; // Wartedatei
zurück;
}
DIKTLOADING = true;
const res = Warteruf(data/wordlists/${lang}.txt;
const text = warten res.text();
// Konvertieren in Set<string> für O(1) Lookup
DIKTWORDS = neues Set(
Text.split("\n")
.map(w => w.normalize("NFC").trim().toLowerCase())
.filter(w = >= >= 4)
;
DIKTLANG = Lang;
DIKTLOADING = falsch;
}
Warum? Set ? Struktur Set JavaScript garantiert O(1) Lookups – unabhängig von der Wörterbuchgröße (50.000 oder 200.000 Einträge), Verifikation DICTWORDS.has(word) nimmt die gleiche konstante Zeit. Array würde O(n) pro Lookup erfordern, d.h. bis zu 200.000 Vergleiche pro Check.
Warteschlange laden
Die DICTÄNDERUNGLANG vermeidet Rassebedingungen bei schnellen Sprachänderungen:
Scénario : l'utilisateur switche rapidement EN → FR → DE
├── EN demandé : DICTLOADING = falsch → Beginn des Ficks EN
FR beantragt während des Ficks EN : DICTLOADING = true → DICTÄNDERUNGLANG = "fr"
├── DE demandé pendant fetch EN : DICTLOADING = true → DICTPENDINGLANG = "de" (crash "fr")
- Federende: DICTLANG = "en", puis lance loadDictionary("de")
└── Résultat : seule la dernière langue demandée est chargée
Dieses Verhalten ist absichtlich: Die zuletzt geforderte Sprache wird geladen, nicht alle Zwischensprachen.
8. Wörterbuch Erkennung inTime2Crack: isDictWord()
8.1. Erkennungsoperation
Die Funktion isDictWord(pw) bestimmt, ob ein Passwort aus einem aktuellen Wörterbuchwort abgeleitet ist oder wird:
// app.js - ligne 2181
function isDictWord(pw) {
if (!DICT(WORDS) Rückgabe falsch;
// Standardisierung: NFC + Unterkoffer
const l = pw.normalize("NFC").toLowerCase();
// Direkte Verifikation
wenn (DICT)
WORDS.has(l) || DICTWORDS.has(deLeet(pw))
// Morphologische Variationen
const deleetWord = deLeet(pw)
const Variationen = getMorphVariations(deleetWord);
für (Konst. Variationen) {
wenn (DICT)
WORDS.has(variation)) return true;
}
Rückgabe falsch;
}
3 Schichterfassungslinie :
8.2 Unicode Standardisierung (NFC)
Standardisierung normalize("NFC") sorgt dafür, dass akzentuierte Zeichen konsequent behandelt werden:
Diese Standardisierung wird sowohl bei der Erstellung des Wörterbuchs als auch bei der Überprüfung angewendet, um eine korrekte Korrespondenz für Akzentsprachen (FR, ES, DE, PT, etc.) zu gewährleisten.
8.3 Auswirkungen auf die Schwachstelle erkannt
Wann isDictWord() Zurück truemehrere Angriffe gelten:
hybridVuln = true → 1000 Mutationen auf Wörterbuchbasis getestet9. De-leetification: wie der Angreifer Substitutionen dekodiert
9.1 Leetspeak und seine Einschränkungen als Schutz
Der Leetspeak (oder "1337 Sprache") ist eine Praxis, Briefe durch visuell ähnliche Zahlen oder Symbole zu ersetzen: a→@, e→3, i→1 oder !, o→0, s→$. Benutzer verwenden es, um "strengthen" gemeinsame Wörter.
Die Realität: diese Substitutionen sind die ersten geltenden Regeln Sie stellen keine echte Verteidigung gegen einen kompetenten Angreifer dar.
9.2 Implementierung deLeet() inTime2Crack
// app.js - ligne 3622
const LEETBASE =
a: ["@", "4"],
e: ["3"],
o: ["0"]
s: ["$", "5"],
t: ["+", "7"],
h: ["#"]
g: ["9"],
};
Funktion vonLeetWith(pw, oneMap) {
r = pw.normalize("NFC").toLowerCase();
für (const [ch, reps] of Object.entries(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;
}
Funktion vonLeet(pw) {
// Mehrdeutigkeit: "1" kann "i" oder "l" sein
const withI = deLeetWith(pw, { i: "1!", l: "" });
const mitL = deLeetWith(pw, { l: "1", i: "!" });
// Wenn das Wörterbuch geladen wird, bevorzugen Sie die Variante, die passt
wenn (DICT)WORDS {
wenn (DICT)WORDS.has(withL) mit L zurück;
wenn (DICT)WORDS.has(mitI) mit I zurück;
}
// Andernfalls: bevorzugen Sie die Variante mit den am wenigsten verbleibenden Zahlen
const digsI = (mit I.match(/\d/g)
const digsL = (mit L.match(/\d/g)
Zahl L < = Zahl I? mitL: mitI;
}
9.3 Mehrdeutigkeitsmanagement "1" → "i" oder "l"
Die Substitution "1" ist mehrdeutig: "1" kann "i" (wie in "1nfo" → "info") oder "l" (wie in "p1ayer" → "player") darstellen.Time2Cracklöst diese Mehrdeutigkeit durch:
9.4 Nicht erfasste Substitutionen (absichtlich)
Time2Crackdie seltenen oder mehrdeutigen Substitutionen nicht über LEETBASE-Muster hinaus. Dies ist eine Design-Auswahl: zu viele Fälle würden falsche Positive erhöhen (die Erkennung eines Passworts als "aktuelles Wort", während es nicht ist).
10. Berechnung der Rißzeit: addDictionaryAttacks()
Rechenlogik
// 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
konstnote = schwach ? t("nWeakPassword")
: häufig ? t("nInLeaks")
: dictWord ? t(nDictHit)
: t(nAbsentLeaks);
Zeilen.push({ atk: t("aDict"), hash: a.name, spleen: a.rate, sec, note, cat: "dict" });
}
}
10.2 Drei Ebenen der Sicherheitslücke
Ebene 1 — Ultra-weak (weak = true) : ~100 / Milz
Das Passwort befindet sich in der Top 100 der Welt ("Passwort", "123456", "qwerty"...). Ein Angreifer, der diese 100 Prioritätskandidaten testet, findet es im ersten Pass. 0,6 Nanosekunden.
Ebene 2 — Gemeinsam (common = true)
Das Passwort befindet sich in der Referenz-HIBP-Liste der ~10.000 häufigsten Passwörter. Diese Kandidaten werden in den ersten Mikrosekunden getestet. Für MD5: 10.000 / 168,9e9 59 Nanosekunden.
Ebene 3 — DictWord (dictWord = true) : ~200.000 / Milz
Das Passwort ist ein Wort aus dem aktuellen Sprachwörterbuch (local wordlist ~50k–200k Einträge). Ein kompletter Scan der Wortliste ist fast sofort für schnelle Algorithmen. Für MD5: 200 000 / 168,9e9 1.18 Mikrosekunde.
Ebene 4 — Nicht anwendbar (sec = null) : Das Passwort ist weder ultra-weak noch allgemein, noch ein Wort aus dem aktuellen Wörterbuch. Der Wörterbuchangriff allein ist nicht anwendbar — andere Angriffe (Bruchkraft,Markov,PCFG) die Hauptbedrohung werden.
10.3 Warum diese Zahlen (100, 10.000, 200.000)?
Diese Werte werden auf aktuelle Daten kalibriert:
10.4 Vollständiges numerisches Beispiel
Für das "Sun"-Passwort (aktuelles französisches Wort, erkannt als dictWord)
Selbst für Argon2id, 250 Sekunden ist weniger als 5 Minuten - für ein einfaches Wort aus dem Französisch Wörterbuch.
11. Hohe Treuekalibrierung: applyHighFidelityCalibration()
11.1 Warum zusätzliche Kalibrierung?
Bruttoberechnung addDictionaryAttacks() gibt eine Schätzung des "wurst case" — als ob der Angreifer die gesamte Wortliste gleichmäßig testen würde. geordnet nach Wahrscheinlichkeit : Die häufigsten Passwörter kommen zuerst an.
Hohe Treuekalibrierung gilt für einen Korrekturmultiplikator basierend auf empirischen Beobachtungen:
// 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.dictWord ? 0.5: 1.0;
Bruch
Multiplikator common (0.15) : Wenn sich das Passwort in der gemeinsamen Prioritätsliste befindet, wird es im Durchschnitt am 15. Perzentil der Liste gefunden - das ist ~ 1.500 Tests der 10.000 aufgelistet. Zeit wird mit 0.15 → 6.7× schneller als der einheitliche Scan multipliziert.
Multiplikator dictWord (0,5) : Ein gemeinsames Wörterbuchwort findet sich im Durchschnitt Mitte der gut sortierten Liste. Multiplier 0.5 → 2× schneller als der einheitliche Scan.
11.2 Akademische Quellen der Kalibrierung
12. Wahrscheinlichkeit der Anwendbarkeit und des Vertrauens
12.1 Scoring-System
Time2Cracknicht nur eine Zeit berechnen – sie wertet auch die Wahrscheinlichkeit aus, dass der Wörterbuchangriff tatsächlich der schnellste Angriff ist, über ein Multi-Faktor-Scoring-System:
// Score d'applicabilité (0-1)
case "dict":
return context.common ? 0.99 : context.dictWord ? 0.85 : 0;
common Das Passwort ist in HIBP → der Wörterbuchangriff gilt mit maximalem Vertrauen.dictWord Nur: hohe Wahrscheinlichkeit. Ein Wörterbuchwort ist verletzlich, aber ein Angreifer muss die richtige Sprachwortliste haben.12.2 Evidenzwert
Parallel zum Applicability-Score erfasst ein "Evidence" die beobachteten Signale:
case "dict":
return Number(!!context.common) + Number(!!context.dictWord);
// 0 : aucun signal
// 1 : un signal (common OU dictWord)
// 2 : deux signaux (common ET dictWord)
Ein Beweiswert von 2 (Wort sowohl im HIBP als auch im sprachlichen Wörterbuch) erhöht das endgültige Vertrauen von 0,08 (2 × 0,04).
12.3 Final Confidence Score
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
Zeile.confidence = Math.max(0, Math.min(1,
Math.max(Anwendbarkeit, Basis) + evidenzBoost - spezifischPenalty
),
Für ein Passwort common mit dictWord auch erkannt:
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.0Maximales Vertrauen: Der Wörterbuch-Angriff ist der primäre Angriff eindeutig.
13. Bloom filter RockYou: lokale Erkennung von weit verbreiteten Passwörtern
13.1 Hintergrund
Neben der HIBP-Verifikation (die einen Netzwerkanruf erfordert),Time2Crackintegriert ein bloom filter Ein Blütenfilter ist eine probabilistische Datenstruktur, die es Ihnen erlaubt, die Zugehörigkeit zu einem Satz mit einer Wahrscheinlichkeit von falschen Positiven zu testen (~1%), ohne die Elemente selbst zu speichern.
13.2 Vorteile des Blütenfilters
KriterienHIBP k-AnonymitätFilter lokal ----------------------------------- Deckung~14 Milliarden~14 Millionen (RockYou) Latenz50–200 ms (Netzwerk)< 1 ms (lokal) Vertraulichkeitk- Anonymität (5 SHA-1 Tanks)100% lokal, nichts übertragen Falsch positiv0 %~1% ~ GrößeAPI~2–5 MB (Blühfilter binär)13.3 Betrieb des Doppelhaspels
// app.js - ligne 1962
function bloomHas(filter, word) {
if (!filter) return false;
const { bitArray, m, k } = filter;
const w = word.toLowerCase();
// Double-Hashing: h1 und h2 sind zwei unabhängige Hash-Funktionen
const h1 = fnv1a32(w, 2166136261); // FNV1a mit Standardsaat
const h2 = fnv1a32(w, 0x811c9dc5); // FNV1a mit alternativem Saatgut
für (let i = 0; i < k; i++) {
= (h1 + (i) (h2) >>> (0)) % m; // k Positionen im Bit-Array
const byteIdx = Math.floor(pos / 8);
const bitIdx = pos % 8;
// Wenn ein bisschen 0 ist: das Wort ist DEFINITLY abwesend
wenn ((bitArray[byteIdx] & (1 << bitIdx)) = 0) falsch zurückgeben;
}
// Alle Bits sind bei 1 : das Wort ist PROBABLY vorhanden (mit 1% von FP)
Rückkehr wahr;
}
Das Doppelhashing FNV1a sorgt für eine gleichmäßige Verteilung von Positionen im Bit-Array, minimiert Kollisionen und hält die falsche Positivrate nahe 1%.
13.4 Lade- und Binärformat
Der Blütefilter wird in data/rockyou.bloom — eine binäre Datei mit
Die Last wird vom Benutzer manuell ausgelöst (Taste in der UI), nicht automatisch bei der Seitenbelastung – um die Ausgangsleistung zu erhalten.
14. Vergleich mit abgeleiteten Angriffen
Der "reine" Wörterbuch-Angriff ist die erste von einer Familie von Angriffen, die alle eine gemeinsame Wurzel teilen: eine lexische Wortliste.Time2Crackimplementiert 7 Offline-Cracking-Modelle (Brutskraft, Wörterbuch, Hybrid, Maske,PCFG,Markov, Kombinator), jeder angreift das Passwort aus einem anderen Winkel.
14.1 Wörterbuch vs.Hybride)
KriterienWörterbuchHybride (dict+rules) -------------------------------------- KandidatenWörter als WörterbuchWörter + ~1000 Mutationen pro Wort Schlüsselbereich200.000 Kandidaten~200 Millionen Kandidaten Gekrackte Beispiele"Passwort", "Sun""P@ssw0rd!", "s0l3il2024" Relativgeschwindigkeit1000× schnellerViel breitere Abdeckung Anwendbar beigenaue Wort in der ListePasswort abgeleitet von einem DiktwortDer Hybridangriff beginnt, wo das reine Wörterbuch aufhört: es nimmt jedes Wort von der Wortliste und wendet systematische Mutationsregeln an (hashcat "best64.rule" im Kopf).
14.2 Wörterbuch vs.PCFG
KriterienWörterbuchPCFG ----------------------- ModellFeste Liste der KandidatenProbabilistische Struktur Grammatik KraftGenaue WörterWord+Digits Strukturen, Cap+lower+sym Beispiel"Passwort" → ✓"Password123" → ✓ (Struktur erfasst) DeckungBekannter VokabularGenerische menschliche StrukturenEin Passwort wie "Password123" kann unbemerkt in einem Wörterbuch gehen (das genaue Wort "Password123" darf nicht aufgeführt werden) aber wird sehr schnell vonPCFGdie die Struktur [Majuscule][minuscules][figuren] erkennt.
14.3 Wörterbuch vs.Markov
KriterienWörterbuchMarkov ------------------------- KandidatenVorkompilierte ListeFly-generiert durch statistisches Modell DeckungBekannter VokabularJede wahrscheinliche "menschliche" Sequenz VorteilSehr schnell auf exakten WörternCovers unbekannte Wortschatzwörter Beispiel"Sunshine" → ✓"sunsh1ne" potenziell ✓DieMarkovdeckt Fälle ab, in denen das Passwort wie ein menschliches Wort aussieht, ohne in irgendeiner Liste zu sein.
14.4 Wörterbuch vs Credential Stuffing
KriterienWörterbuchEinzigartiges Stuffing -------------------------------------- ZielEinen Hasch klopfenTesten Sie einen bestimmten Login MechanikHash lokale BerechnungenRemote-Verbindungsversuche QuelleGenerelle WortlistePaar Login/Passwort Lecks VerteidigungStarker Hash-AlgorithmusGeschwindigkeitsbegrenzung, MFA, IP-BlockungCredential stuffing attackiert keine Hash – es versucht direkt Login/Passwort-Paare auf Remote-Dienste. Es ist konzeptuell anders als Cracking, aber teilt die gleiche Datenquelle (HIBP/fail).
15. Einschränkungen des Angriffswörterbuchs
15.1 Eigene Grenzen
1. Bekannte Wortschatz nur Ein erfundenes Passwort, das kein vorhandenes Wort ähnelt und nicht in HiBP ist, ist undurchlässig für einen reinen Wörterbuchangriff. "Xqz7mK9pL" wird nie in irgendeiner Wortliste sein. 2. Sprachabdeckung Ein Angreifer, der einen französischsprachigen Benutzer ohne französische Wortliste anvisiert, wird Wörter wie "ephemeral", "grenouille" oder "bricolage" vermissen, die nicht in Standard-englischen Wortlisten sind. 3. Neue Passwörter Ein Anmeldetag, der gerade erstellt wurde und nie geflüchtet wurde, wird nicht in HiBP sein — auch wenn es sehr häufig ist, muss es bis zum nächsten Leck warten, um es zu finden. 4. Sehr lange Passwörter Ein Passwort, bestehend aus einer langen erfundenen Phrase ("MaGrandeAventure2024SousLesEtoiles"), wird in keiner Wortliste sein – auch wenn jedes Wort separat genommen trivial ist.Combinator, PRINCE).15.2 Was die BerechnungTime2Cracknicht model
Inhaltsverzeichnis : ein Angreifer, der auf einen bestimmten Sektor zielt, wird angepasste Wortlisten (medizinische Begriffe für Krankenhäuser, Videospielslang für Spielplattformen) erstellen.Time2Crackverwendet generische Wortlisten. Kombinierte Bruttokraft-Wortlisten : Tools wie CeWL (Custom Word List Generator) können Begriffe aus der Ziel-Website extrahieren, um eine benutzerdefinierte Wortliste zu erstellen. Aktuelle Lecks noch nicht in HIBP zwischen dem Moment, in dem ein Leck auftritt und dessen Integration in HIBP, zirkulieren die kompromittierten Anmeldeinformationen in privaten Foren, ohne über die öffentliche API zugänglich zu sein. Hash Algorithmen nicht abgedeckt :Time2Crack6 Algorithmusmodelle (MD5, SHA-1, SHA-256, NTLM, bcrypt, Argon2id). Algorithmen wie SHA-512, scrypt oder PBKDF2 haben unterschiedliche Profile.16. Wirksame Verteidigung
16.1 Was schützt vor Wörterbuch-Angriff
Moderner Hash-Algorithmus (Bcrypt, Argon2id) Dies ist die effektivste Verteidigung auf der Serverseite.Der Unterschied von 10 + Größenordnungen zwischen MD5 und Argon2id macht das Wörterbuch-Passwort "sun" in der Praxis immun, wenn durch Argon2id geschützt - auch wenn der Angreifer weiß, dass es ein französisches Wort ist.
Einzelsalz pro Konto Ein Salz verhindert vorkalkulierte Tischangriffe und zwingt den Angreifer, für jedes Konto einzeln neu zu berechnen. Es schützt nicht gezielte Wortlistenangriffe (der Angreifer kann noch die 200.000 Wörter mit dem Salz testen), aber unwirksamiert die Regenbogentabellen und macht massive Angriffe auf große Datenbanken undurchführbar. Passwort Länge Ein Passwort eines einzelnen Wörterbuchwortes (8-10 Zeichen) ist verletzlich. Eine Passphrase von 4-5 Wörtern ("horse-light-forest-travel") ist resistent gegen reines Wörterbuch-Angriff, aber nicht gegen AngriffCombinator— daher die Bedeutung von Länge und Zufall. Zufällig generierte Passwörter Die eigentliche Lösung: Verwenden Sie einen Passwort-Manager, der lange zufällige Passwörter erzeugt (20+ Zeichen aller Arten). Multifaktor-Authentifizierung (MFA) Die MFA verhindert nicht Riss offline (der Angreifer erholt Hashs und Risse offline), sondern schützt vor Anmeldeinformationen (verwende knackte Anmeldeinformationen). Geschwindigkeitsbegrenzung und Erkennung von Anomalien Schützt gegen Online-Angriffe (direkte Verbindungsversuche), nicht gegen Offline-Cracking gestohlener Hashs.16.2 Was nicht schützt
Einfache Leet-Substitutionen : "Passwort" → "p@ssw0rd" — siehe Abschnitt 9. Zahlen am Ende hinzugefügt : "password" → "password1" – unter den ersten getesteten Regeln. Erste Zahlung : "Passwort" → "Passwort" — Standardkapitalisierungsregel. Figuren und Symbole, wenn das Wort erkennbar bleibt "sunshine!" ist in jeder Wortliste, die "sunshine" mit Grundregeln beinhaltet. Komplex ohne Länge "P@s1w" erfüllt die Komplexitätskriterien (maj, min, number, symbol) aber ist kürzer und vorhersehbarer als "correcthorsebaterystaple".16.3 Praktische Empfehlungen
17. Referenzen
Primärquellen (Akademische Studien)
Morris, R., & Thompson, K. (1979). Passwort-Sicherheit: Eine Fallgeschichte. Mitteilungen der ACM, 22(11), 594-597.common ? 0.15 (ober 10k Ebene)Industrielle Quellen
Habe ich Pwned (2024). Pwned Passwords. https://haveibeenpwned.com/PasswordsSekundärquellen (Kontext)
Troy Hunt. (2013). Einführung 306 Millionen Frei herunterladbare Pwned-Passwörter. troyhunt.com.Webquellen, die in der Anmeldung genannt werdenTime2Crack
IEEE Xplore (diktive Referenz). https://ieeexplore.ieee.org/document/6234435descDict (app.js) für die Reihenfolge der Abdeckung der Top-Wörterbücher.ProjektdokumentTime2Crack— Version 1.0 — 2026-04-01 Quellcode:
app.js (Funktionen) addDictionaryAttacks, isDictWord, deLeet, loadDictionary, applyHighFidelityCalibration, bloomHas)*