Woordenboekaanval Uitgebreide operatie
Projectreferentiedocument Time2Crack
Ontvangers: ontwikkelaars, security onderzoekers, geavanceerde gebruikers
Inhoud
isDictWord()addDictionaryAttacks()applyHighFidelityCalibration()1. Overzicht
Dictionary attack is de oudste wachtwoord kraken methode, de eenvoudigste conceptueel, en statistisch meest effectief op de meerderheid van de echte menselijke wachtwoorden. Het principe is om te testen, in afnemende volgorde van waarschijnlijkheid, een vooraf samengestelde lijst van kandidaten
Waarom is het verschrikkelijk effectief? Mensen niet kiezen hun wachtwoorden willekeurig. Decennia van datalekken onthullen dat de werkelijke distributie van wachtwoorden is zeer geconcentreerd: de meest voorkomende 1000 wachtwoorden vertegenwoordigen ongeveer 5 tot 10% van alle online accounts. De meest voorkomende 1 miljoen dekking 40 tot 60%. Een goed gebouwde woordenboek aanval zal deze kandidaten testen in milliseconden tot secondenIn Time2Crack, de woordenboek aanval modellen twee verschillende maar complementaire mechanismen:
Deze twee detecties zijn onafhankelijk en complementair: HiBP dekt de exacte compromisgegevens, de wordlist dekt de gemeenschappelijke woorden die nog niet gelekt zijn.
2. Historische en academische achtergrond
2.1 Oorsprong
De woordenboekaanval gaat vooraf aan het moderne tijdperk van computerbeveiliging. De eerste Unix systemen opgeslagen wachtwoorden in gewone taal in /etc/passwd, maakt elke woordenboek aanval triviaal zodra het bestand toegankelijk was.
2.2 Oprichtingslekken
Sommige lekken hebben het landschap van de aanval door woordenboek veranderd door de feitelijke verspreiding van menselijke wachtwoorden te onthullen:
RockYou (2009) Een ontwikkelaar had 14,3 miljoen wachtwoorden opgeslagen in gewone taal.- Wachtwoord #1 ("123456") vertegenwoordigde 290.731 rekeningen (2%)
2.3 Referentiebenchmarks voor woordenboekaanval
Een woordenlijst van 200.000 inzendingen getest met de snelheid van een RTX 4090:
AlgoritmeSnelheidTijd voor 200k kandidaten -------------------------Onverzadigd MD5168,9 GH/s~1,2 nanoseconde SHA-150,86 GH/s~3,9 nanoseconden SHA-25622.68 GH/s~8,8 nanoseconden NTLM288,5 GH/s~0,7 nanoseconde bcrypt (kosten 5)184 kH/s1,09 seconde Argon2id~67 H/s50 minutenDe woordenboekaanval is daarom bijna onmiddellijk voor MD5, SHA-1 en NTLM en blijft zeer snel zelfs voor bcrypt op kleine lijsten.
3. Conceptuele fundamenten: waarom woordenboeken werken
3.1 De machtswet van menselijke wachtwoorden
Alle empirische studies komen samen in de richting van dezelfde observatie: de verdeling van menselijke wachtwoorden is niet uniform machtsrecht Sommige wachtwoorden concentreren een onevenredige fractie van keuzes.
Formeel : als alle wachtwoorden worden geclassificeerd door afnemende frequentie, de frequentie van het rangwachtwoord r is evenredig met r^(-α) met α 1,5 tot 2 Volgens het corpus.Directe gevolgen: 10 meest voorkomende wachtwoorden Een aanvaller die slechts 10 kandidaten al een kans in 20 om te slagen statistisch, het is enorm voor de hoeveelheid lawaai gegenereerd.
3.2 Cognitieve Bias in Wachtwoordcreatie
Mensen kiezen niet willekeurig. Ze passen systematisch heuristiek toe die hun wachtwoorden voorspelbaar maken:
3.3 Het begrip "password al in de lijsten"
Een wachtwoord kan in een aanvalslijst staan om twee verschillende redenen:
Reden 1 Hij is in HIPP De exacte credential is gecompromitteerd in een verleden lek. De aanvaller hoeft niet om te raden dat het test de bekende referenties een voor een, in volgorde van frequentie. Als de doelserver accepteert de credential, het is voltooid. Reden 2 Het staat in een taalwoordenlijst Het wachtwoord is een gewoon woord van gewone woordenschat. Zelfs als het nooit is gevlucht, het is in alle aanval wordlists omdat het een voor de hand liggende kandidaat is. "Paillon" mag niet in HiBP, maar het is in de Franse woordenlijst van een ernstige kraakmiddel.Deze twee gevallen komen overeen met aanvallen van een andere aard, met verschillende snelheden en dit is precies wat Time2Crack modellen.
4. Architectuur van een moderne woordenboek aanval
4.1 Algemene pijpleiding
Een moderne woordenboek aanval vindt plaats in verschillende fasen:
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)
Fase 2: Woordenlijst Voorverwerking
- Sorteer op frequentie (meest waarschijnlijk eerst)
- - Deduplicatie (niet tweemaal dezelfde kandidaat)
- - Lengtefiltratie (doellengte + ±2)
- Normalisatie (lagere case, Unicode NFC)
Fase 3: Berekening van kandidaat Hashs
Voor elke kandidaat w in de woordenlijst:
│ hashkandidaat = hashalgo(w)
Promotional │ if hashkandidaat== hashDoel: Gevonden
- Snelheid: 168 GH/s voor MD5 op RTX 4090
Fase 4: Analyse van de resultaten
Rapport van gekraakte wachtwoorden, dekkingsstatistieken
4.2 Hardwareoptimalisatie
Moderne woordenboek aanvallen worden massaal parallel op GPU:
Voor een woordenlijst van 14 miljard inzendingen (HBP-grootte) op 12× RTX 4090:
Dit verschil van ~9 orden van grootte tussen MD5 en bcrypt verklaart waarom de keuze van de hash algoritme is cruciaal.
4.3 Testvolgorde van de kandidaten
De woordenlijst is niet in alfabetische volgorde getest. gesorteerd op afnemende waarschijnlijkheid :
Dit soort zorgt ervoor dat als het wachtwoord "laag" is, het zal worden gevonden in de eerste milliseconden
5. Het corpus van echte wachtwoorden
5.1 Hebben ik geploegd (HIBP)
Grootte ~14 miljard unieke wachtwoorden (2024) Bron : samenvoeging van openbare lekken sinds 2013 Formaat : SHA-1 gesorteerd op frequentie van verschijning Toegang van het publiek : k- anonimiteit API, volledige hash download beschikbaar voor verdedigersHiBP is de wereldwijde referentie omdat:
Een aanvaller met de complete HIPP dump kan eerst de ~14 miljard kandidaten in dalende volgorde van frequentie testen. Voor niet-gezouten algoritmen (MD5, SHA-1), deze lijst dekt in de orde van 50-70% van alle echte online wachtwoorden.
5.2 RockYou (2009)
Grootte : 14,3 miljoen duidelijke wachtwoorden Belangrijkste kenmerken : RangWachtwoordVoorvallen% corpus ------- [57]- [57]- [57] 1123456290 7312,03% 21234579 0780,55% 312345678976 7900,54% 4wachtwoord59 4620,42% 5Ik hou van je.49 9520,35% Top 10Wat?~650,000~4,5% Top 100Wat?~1 200 000~8,4% Top 1 000Wat?~2 500 000~17,5% Top 10.000Wat?~4 500 000~31,5% Onderwijs Test slechts 10.000 kandidaten (100 μs MD5 snelheid) compromissen ~31% van een database van MD5 beschermde accounts.5.3 Verzamelingen van gespecialiseerde woordenlijsten
Seclists (Daniel Miessler): open-source verzameling van ~4 GB woordenlijsten die betrekking hebben op:Deze corpuses zijn publiekelijk downloadbaar en hun bestaan is een vaststaand feit van offensieve veiligheid.
6. K-Anonimity Verificatie HIPB: Een echte-tijd aanval
6.1 Protocol k- anonimiteit
Time2Crack bevat een real-time HIPP check die precies reproduceert wat een aanvaller zou doen met de HIPP database
Het k-anonimiteitsprotocol werkt als volgt:
1. Calculer SHA-1(password) → par exemple "CBFDAC6008F9CAB4083784CBD1874F76618D2A97"
Stuur alleen de eerste 5 tekens naar de HIPP API: "CBFDA"
De API geeft ALL SHA-1 achtervoegsels terug die beginnen met "CBFDA" (ongeveer 400-600 hashes)
Zoek lokaal als de rest van de hash ("C6008F9CAB4083784CBD1874F76618D2A97") in de lijst staat
Indien gevonden: wachtwoord is aangetast (HIBP geeft ook het aantal lekken)
Garantie van vertrouwelijkheid De HIBP server ziet nooit de complete hash (dus kan het wachtwoord niet identificeren), laat staan het duidelijke wachtwoord. De uiteindelijke berekening wordt lokaal gedaan.
Wat dit betekent voor de aanval Dit betekent dat een aanvaller met de HIPP-database die deze credentialiteit test, hem in een zeer hoge positie op zijn lijst, gesorteerd op frequentie, in een fractie van nanoseconden zou vinden.
6.2 Implementatie in Time2Crack (app.js)
De HIPP check is asynchroon en niet-blokkerend. Het wachtwoord wordt onmiddellijk geanalyseerd door lokale methoden, en de HIPP check vult het resultaat aan:
// 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 respons = wacht fetch(
https://api.pwnedpasswords.com/range/${prefix}
);
const regels = wacht op respons.text();
voor (cont lijn van lijnen.split('\n')) {
const [hashSuffix, count] = line.split(':");
indien (hashSuffix.toLowerCase() = suffix.toLowerCase()) {
return parseInt(count); // aantal lekken
}
}
teruggeven 0; // niet gevonden
}
HIB-prestatiegegevens :
6.3 Interpretatie van graaf HIPP
De door HiBP geretourneerde telling geeft het aantal keren aan dat dit exacte wachtwoord verscheen in geïndexeerde lekken:
AantalInterpretatieCracktijd (MD5, 12× RTX 4090) ------------------------------------------------------------ > 1 000 000Top 100 Wereld< 1 nanoseconde 10.000Zeer vaak< 10 nanoseconden 1 000Vaak< 100 nanoseconden 100Soms, maar bekend< 1 microseconde 100Zelden maar aangetast< 10 microsecondenZelfs een telling van 1 (het wachtwoord verscheen slechts een keer in een lek) geeft een kwetsbaarheid aan: als een aanvaller dit account specifiek richt en heeft de lijst van referenties van het lek in kwestie, zal hij het vinden.
7. Time2Crack Taal Wordlists
7.1 Waarom taalwoordenlijsten naast HIPP
HiBP heeft betrekking op de exacte compromis criminaliteiten
De taalwoordenlijst van Time2Crack dekt deze kloof:
TaalBronGeschatte grootte -------------------------------- EngelsSeclists Wikipedia NL200.000 inzendingen Frans (fr)Seclists Wikipedia NL150.000 inzendingen SpaansSecLists Wikipedia ES150.000 inzendingen Portugees (pt)SecLists Wikipedia PT~120,000 inzendingen DuitsSecLists Wikipedia DE180.000 inzendingen Turks (tr)SecLists Wikipedia TR100.000 inzendingen Italiaans (it)kkrypt0nn100.000 inzendingen Pools (pl)kkrypt0nn~80 000 vermeldingen Nederland (nl)kkrypt0nn~80 000 vermeldingen Filteren toegepast Alleen woorden van ≥ 4 karakters worden behouden (de 17.2 Luie belasting
Wordlists zijn niet opgenomen in de code
// app.js - loadDictionary()
async function loadDictionary(lang) {
if (DICTLang & DICTWORDS) return; // Déjà chargé
if (DICTLADING) {
DICTPENDINGLANG = lang; // Wachtbestand
terugkeer;
}
DICTLOADING = true;
const res = wacht op fetch(data/wordlists/${lang}.txt);
const tekst = wacht res.text();
// Converteren naar Set<string> voor O(1) opzoeken
DICTVERMELDING = nieuwe verzameling(
text.split("\n")
.map(w => w.normalize("NFC").trim().toLowerCase())
.filter(w => w.lengte >= 4)
);
DICTLANG = Lang;
DICTLOADING = vals;
}
Waarom een Set ? Structuur Set JavaScript garandeert O(1) lookups, ongeacht de grootte van het woordenboek (50.000 of 200.000 inzendingen), verificatie DICTWORDS.has(word) Het duurt even lang. Array per lookup, d.w.z. tot 200.000 vergelijkingen per controle.
Wachtrij wordt geladen
De DICTHUNGLANG Vermijdt raceomstandigheden tijdens snelle taalveranderingen:
Scénario : l'utilisateur switche rapidement EN → FR → DE
├── EN demandé : DICTLOADING = vals → start van de fetch NL
FR gevraagd tijdens ophalen NL : DICTLOADING = true → DICTHUNGLANG = "fr"
├── DE demandé pendant fetch EN : DICTLOADING = True → DICTPENDINGLANG = "de" (crash "fr")
- Einden ophalen: DICTLANG = "en", puis lance loadDictionary("de")
└── Résultat : seule la dernière langue demandée est chargée
Dit gedrag is opzettelijk: de meest recent gevraagde taal wordt geladen, niet alle tussenliggende talen.
8. Dictionary Detection in Time2Crack: isDictWord()
8.1. Opsporing
De functie isDictWord(pw) bepaalt of een wachtwoord is of is afgeleid van een huidige woordenboekwoord:
// app.js - ligne 2181
function isDictWord(pw) {
if (!DICT(Stemmen) return false;
// Normalisatie: NFC + Kleine letters
const l = pw.normalize("NFC").toLowerCase();
// Directe controle
indien (DICT)
WORDS.has(l) || DICTVERMELDING.has(deLeet(pw)) return true;
// Morfologische variaties
const deleetWord = deLeet(pw);
const variaties = getMorphVariations(deleetWord);
voor (cont variatie van variaties) {
indien (DICT)
WORDS.has(variation)) return true;
}
Foutief retourneren;
}
3 laagdetectielijn :
8.2 Unicodenormalisatie (NFC)
Normalisatie normalize("NFC") zorgt ervoor dat geaccentueerde tekens consequent worden behandeld:
Deze normalisatie wordt toegepast zowel bij het aanmaken van het woordenboek als bij het controleren van de juiste correspondentie voor accenttalen (FR, ES, DE, PT, enz.).
8.3 Effect op geconstateerde kwetsbaarheid
Wanneer isDictWord() Ga terug. trueverschillende aanvallen worden van toepassing:
hybridVuln = true → 1000 mutaties getest op woordenboekbasis9. Ontleeting: hoe de aanvaller substituties decodeert
9.1 Leetspeak en zijn beperkingen als bescherming
De leetspeak (of "1337 speech") is een praktijk om letters te vervangen door visueel vergelijkbare getallen of symbolen: a→@, e→3, i→1 of !, o→0, s→$. Gebruikers gebruiken het om gemeenschappelijke woorden te "versterken."
De realiteit: deze substituties zijn de eerste toegepaste regels Ze vormen geen echte verdediging tegen een bekwame aanvaller.
9.2 Uitvoering deLeet() in Time2Crack
// app.js - ligne 3622
const LEETBASE =
a: ["@," "4"],
e: ["3"],
o: ["0"],
s: ["$," "5"],
t: ["+," "7"],
h: ["#"],
g: ["9"],
};
functie vanLeetWith(pw, oneMap) {
laat r = pw.normalize("NFC").toLowerCase();
voor (const [ch, reps] of Object.entrys(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;
}
functie vanLeet(pw) {
// Ambiguïteit: "1" mag "i" of "l" zijn
samen metI = deLeetWith(pw, { i: "1!", l: "" });
const withL = deLeetWith(pw, {l: "1," i: "!" });
// Als het woordenboek geladen is, geef dan de voorkeur aan de variant die overeenkomt met
indien (DICT)VERMELDING) {
indien (DICT)VERMELDING.has(withL)) return withL;
indien (DICT)VERMELDING. has(withI) return withI;
}
// Anders: verkies de variant met de minst overgebleven nummers
const samenvattingenI = (metI.match(/\d/g)
const samenvattingenL = (metL.match(/\d/g)
Return digit L <= cijfer I ? met L: metI;
}
9.3 Ambiguïteitsbeheer "1" → "i" of "l"
De vervanging "1" is dubbelzinnig: "1" kan "i" vertegenwoordigen (zoals in "1nfo" → "info") of "l" (zoals in "p1ayer" → "speler"). Time2Crack lost deze dubbelzinnigheid op door:
9.4 Niet onder de richtlijn vallende instellingen (bedoeld)
Time2Crack heeft geen betrekking op zeldzame of dubbelzinnige vervangingen die verder gaan dan LEETBASE patronen. Het is een ontwerpkeuze: het bestrijken van te veel gevallen zou de valse positieven verhogen (een wachtwoord als "huidig woord" detecteren, terwijl het dat niet is). De meegeleverde patronen dekken >95% van de werkelijke Leetifications waargenomen in het corpus.
10. Berekening van de kraaktijd: addDictionaryAttacks()
Rekenlogica
// 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 = zwak ? t("nWeakPassword")
: gemeenschappelijk ? t("nInLeaks")
: dictWord ? t(nDictHit)
: t(nAbsentLeaks);
rows.push({atk: t("aDict"), hash: a.name, milt: a.rate, sec, note, cat: "dict" });
}
}
10.2 Drie kwetsbaarheidsniveaus
Niveau 1 Ultrazwak (weak = true) : ~100 / milt
Het wachtwoord is in 's werelds Top 100 ("wachtwoord," "123456," "qwerty"...). Een aanvaller die deze 100 prioritaire kandidaten test vindt het in de eerste pas. Voor MD5: 100 / 168.9e9 0,6 nanoseconde.
Niveau 2 (common = true) : ~10 000 / milt
Het wachtwoord staat in de referentie HIPP lijst van de ~10.000 meest frequente wachtwoorden. Deze kandidaten worden getest in de eerste microseconden. Voor MD5: 10.000 / 168,9e9 59 nanoseconden.
Niveau 3 DictWord (dictWord = true) : ~200.000 / milt
Het wachtwoord is een woord uit het huidige taalwoordenboek (lokale woordenlijst ~50k 1,18 microseconde.
Niveau 4 (sec = null) : het wachtwoord is niet ultra-zwak, noch gebruikelijk, noch een woord uit het huidige woordenboek. De woordenboek aanval alleen is niet van toepassing .
10.3 Waarom deze nummers (100, 10.000, 200.000)?
Deze waarden worden gekalibreerd op feitelijke gegevens:
10.4 Volledig numeriek voorbeeld
Voor het "zon" wachtwoord (huidig Frans woord, gedetecteerd als dictWord) :
Zelfs voor Argon2id is 250 seconden minder dan 5 minuten voor een simpel woord uit het Franse woordenboek.
11. Kalibratie van hoge trouw: applyHighFidelityCalibration()
11.1 Waarom extra kalibratie?
Brutoberekening addDictionaryAttacks() geeft een schatting van de "worst case" gerangschikt naar waarschijnlijkheid : de meest voorkomende wachtwoorden komen eerst.
Hoge betrouwbaarheidskalibratie past een correctieve multiplier toe op basis van empirische waarnemingen:
// 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.vaak ? 0,15: context.dictWord ? 0,5: 1,0;
Break;
Multiplier common (0,15) : als het wachtwoord in de gemeenschappelijke prioriteitenlijst staat, wordt het gemiddeld gevonden op het 15e percentiel van de lijst
Multiplier dictWord (0,5) : een gemeenschappelijk woordenboek woord wordt gevonden op gemiddelde tussentijdse van een goed geordende lijst. Multiplier 0.5 → 2× sneller dan de uniforme scan.
11.2 Academische Kalibratiebronnen
12. Waarschijnlijkheid van toepasbaarheid en betrouwbaarheid score
12.1 Scoresysteem
Time2Crack rekent niet alleen een tijd uit, maar evalueert ook de kans dat de woordenboekaanval de snelste aanval is, via een multifactor scoresysteem:
// Score d'applicabilité (0-1)
case "dict":
return context.common ? 0.99 : context.dictWord ? 0.85 : 0;
common Het wachtwoord is in HIBP → de woordenboek aanval geldt met maximale zekerheid.dictWord Een woordenboekwoord is kwetsbaar, maar een aanvaller moet de juiste taalwoordenlijst hebben.12.2 Bewijsscore
Parallel met de toepasbaarheidsscore registreert een "bewijs" score de waargenomen signalen:
case "dict":
return Number(!!context.common) + Number(!!context.dictWord);
// 0 : aucun signal
// 1 : un signal (common OU dictWord)
// 2 : deux signaux (common ET dictWord)
Een bewijsscore van 2 (woord in zowel HIPP als het taalwoordenboek) verhoogt het uiteindelijke vertrouwen van 0,08 (2 × 0,04).
12.3 Definitieve betrouwbaarheidsscore
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,
Wiskunde.max(toepasselijkheid, basis) + bewijsBoost - specifieke straf
));
Voor een wachtwoord common met dictWord ook gedetecteerd:
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.0Maximale betrouwbaarheid: De woordenboek aanval is de primaire aanval ondubbelzinnig.
13. Bloom filter RockYou: lokale detectie van wijdverbreide wachtwoorden
13.1 Achtergrond
Naast de HIPP verificatie (die een netwerkoproep vereist), bevat Time2Crack een Bloomfilter Een bloom filter is een probabilistische data structuur die u toelaat om te testen behoren tot een set met een waarschijnlijkheid van valse positieven (~1%), zonder het opslaan van de elementen zelf.
13.2 Voordelen van het bloeifilter
CriteriaHIPP k- anonimiteitBloomfilter lokaal ---------------------------------------------- Dekking~14 miljard~14 miljoen (RockYou) Matigheid50<1 ms (lokaal) Vertrouwelijkheidk-anonimiteit (5 SHA-1 tanks)100% lokaal, niets verzonden Valspositief0%~1% GrootteAPI~213.3 Werking van dubbele hashing
// app.js - ligne 1962
function bloomHas(filter, word) {
if (!filter) return false;
const { bitArray, m, k } = filter;
const w = word.toLowerCase();
// Dubbele hashing: h1 en h2 zijn twee onafhankelijke hash functies
const h1 = fnv1a32(w, 2166136261); // FNV1a met standaardzaad
const h2 = fnv1a32(w, 0x811c9dc5); // FNV1a met alternatief zaad
voor (let i = 0; i < k; i++) {
const pos = (h1 + (i (h2) >>> (0)) % m; //k posities in de bitarray
const byteIdx = Math.floor(pos / 8);
const bitIdx = pos % 8;
# If a bit is 0: the word is DEFINITIEFly absent
if ((bitArray[byteIdx] & (1 < < bitIdx)) = 0) return false;
}
// Alle bits zijn op 1 : het woord is waarschijnlijk aanwezig (met 1% van FP)
return true;
}
De FNV1a double-hashing zorgt voor een uniforme verdeling van de posities in de bit array, het minimaliseren van botsingen en het houden van de vals positieven tarief dicht bij 1%.
13.4 Laden en binair formaat
Het bloeifilter wordt opgeslagen in data/rockyou.bloom Een binair bestand met:
De belasting wordt handmatig geactiveerd door de gebruiker (knop in de UI), niet automatisch bij het laden van de pagina om de eerste prestaties te behouden.
14. Vergelijking met afgeleide aanvallen
De "zuivere" woordenboek aanval is de eerste van een familie van aanvallen die allemaal een gemeenschappelijke wortel delen: een lexicale woordenlijst. Time2Crack implementeert 7 offline kraken modellen (bruto kracht, woordenboek, hybride, masker, PCFG, Markov, combinator), elk aanvallen van het wachtwoord vanuit een andere hoek.
14.1 Woordenboek vs Hybride
CriteriaWoordenboekHybride (dict+ rules) ------------ [57]---------------------- KandidatenWoordenboek woorden alsWoorden + ~1000 mutaties per woord Sleutelruimte200.000 kandidaten~200 miljoen kandidaten Gebarsten voorbeelden"wachtwoord," "zon""P@ssw0rd!", "s0l3il2024" Relatieve snelheid1000× snellerVeel breder bereik Van toepassing indienexact woord in de lijstWachtwoord afgeleid van een dict woordDe hybride aanval begint waar het pure woordenboek stopt: het neemt elk woord uit de wordlist en past systematische mutatieregels (hashcat "best64.rule" in gedachten).
14.2 Woordenboek vs PCFG
CriteriaWoordenboekPCFG ------------ [57]------ ModelVaste kandidatenlijstProbabilistische structuur grammatica ForcerenNauwkeurige woordenWord+Digit structuren, Cap+lower+sym Voorbeeld"wachtwoord" → "Wachtwoord123" → DekkingBekende woordenschatAlgemene menselijke structurenEen wachtwoord als "Password123" kan onopgemerkt blijven in een woordenboek (het exacte woord "Password123" kan niet worden vermeld) maar zal zeer snel worden gekraakt door PCFG die de structuur herkent [Majuscule][minuscules][cijfers].
14.3 Woordenboek vs Markov
CriteriaWoordenboekMarkov ------------ [57]-------- KandidatenVooraf samengestelde lijstVliegen gegenereerd door statistisch model DekkingBekende woordenschatElke waarschijnlijke "menselijke" volgorde VoordeelZeer snel op exacte woordenBevat onbekende woorden Voorbeeld"zonneschijn" →"sunsh1ne" potentieelMarkov behandelt gevallen waarin het wachtwoord eruit ziet als een menselijk woord zonder in een lijst te staan.
14.4 Woordenboek vs Credential Stuffing
CriteriaWoordenboekCredential Stuffing ------------ [57]--------------------- DoelEen hash krakenTest een specifieke login MechanismeHash lokale berekeningVerbindingspogingen op afstand BronAlgemene woordenlijstPaar login/wachtwoord lekken DefensieSterk hash-algoritmePrijsbeperking, MVO, IP-blokkeringCredential vulling valt een hash niet aan, het probeert direct inloggen/wachtwoordparen op remote services. Het is conceptueel anders dan kraken, maar deelt dezelfde databron (HIBP/fail).
15. Beperkingen van aanval woordenboek
15.1 Intrinsieke grenswaarden
1. Alleen bekende woordenschat Een uitgevonden wachtwoord dat niet lijkt op een bestaand woord en niet in HiBP is ondoorgrondelijk voor pure woordenboek aanval. "Xqz7mK9pL" zal nooit in een woordenlijst. 2. Taaldekking Een aanvaller die zich richt op een Franstalige gebruiker zonder een Franse woordenlijst mist woorden zoals "ephemeral," "grenouille" of "bricolage" die niet in standaard Engelse woordenlijsten staan. 3. Nieuwe wachtwoorden Een geloof dat zojuist is gemaakt en nooit is gevlucht zal niet in HiBP zijn, zelfs als het zeer gebruikelijk is, zal het moeten wachten tot het volgende lek om het te vinden. 4. Zeer lange wachtwoorden Een wachtwoord bestaande uit een lang uitgevonden zin ("MaGrandeAventure2024SousLesEtoiles") zal in geen enkele woordenlijst staan, zelfs als elk woord apart genomen triviaal is. Dit is het idee achter de wachtwoordzinnen, behandeld door andere aanvallen (Combinator, PRINCE).15.2 Wat Time2Crack's berekening niet Model
Context Woordenlijsten : een aanvaller die zich richt op een specifieke sector zal aangepaste wordlists (medische termen voor ziekenhuizen, video game slang voor gaming platforms) bouwen. Time2Crack maakt gebruik van generieke wordlists. Gecombineerde bruto kracht Wordlists : Hulpmiddelen zoals CeWL (Custom Word List Generator) kunnen termen uit de doelwebsite halen om een aangepaste woordenlijst te bouwen. Dit niveau van targeting is niet gemodelleerd. Recente lekken nog niet in HIPP tussen het moment dat een lek zich voordoet en de integratie ervan in HIPP, circuleren de gecompromitteerde referenties in particuliere forums zonder toegankelijk te zijn via de publieke API. Hash-algoritmen niet behandeld Time2Crack modellen 6 algoritmen (MD5, SHA-1, SHA-256, NTLM, bcrypt, Argon2id). Algoritmes zoals SHA-512, scrypt, of PBKDF2 hebben verschillende profielen.16. Doeltreffende verdediging
16.1 Wat beschermt tegen woordenboekaanval
Moderne hash algoritme (bcrypt, Argon2id) Dit is de meest effectieve verdediging aan de server kant.Het verschil van 10+ orden van grootte tussen MD5 en Argon2id maakt het woordenboek wachtwoord "zon" immuun in de praktijk als beschermd door Argon2id
Enkel zout per rekening Een zout voorkomt voorgecalculeerde tafelaanvallen en dwingt de aanvaller om voor elk account individueel te herberekenen. Het beschermt niet doelgerichte woordlijstaanvallen (de aanvaller kan nog steeds de 200.000 woorden met het zout testen), maar maakt de regenboogtafels ongeldig en maakt enorme aanvallen op grote databases onmogelijk. Wachtwoordlengte Een wachtwoord van een enkel woordenboekwoord (8-10 tekens) is kwetsbaar. Een wachtwoordzin van 4-5 woorden ("cheval-lumière-forest-voyage") is bestand tegen de pure woordenboekaanval, maar niet tegen de Combinatoraanval, vandaar het belang van de lengte EN de randomiteit. Willekeurig gegenereerde wachtwoorden De echte oplossing: gebruik een wachtwoordbeheerder die lange willekeurige wachtwoorden aanmaakt (20+ karakters van alle typen). Deze wachtwoorden zullen nooit in een woordenboek staan. Multifactor-authenticatie (MFA) De MVO voorkomt geen scheur offline (de aanvaller herstelt hashs en scheuren offline), maar beschermt tegen credential vulling (gebruik gebarsten referenties om te verbinden). Snelheidsbeperking en detectie van anomalieën Beschermt tegen online aanvallen (directe verbinding pogingen), niet tegen offline kraken van gestolen hashs.16.2 Wat beschermt niet
Eenvoudige vervanging van leet : "wachtwoord" → "p@ssw0rd" Toegevoegd nummers aan het einde : "wachtwoord" → "password1" onder de eerste geteste regels. Oorspronkelijke betaling : "wachtwoord" → "Wachtwoord" "standaard kapitalisering regel. Cijfers en symbolen indien het woord herkenbaar blijft "zonneschijn!" staat in elke woordenlijst die "zonneschijn" bevat met basisregels. Complexiteit opgelegd zonder lengte "P@s1w" voldoet aan de complexiteitscriteria (maj, min, nummer, symbool) maar is korter en voorspelbaarder dan "correcthorsebaterystaple."16.3 Praktische aanbevelingen
17. Referenties
Primaire bronnen (academische studies)
Morris, R., & Thompson, K. (1979). Wachtwoordbeveiliging: een dossiergeschiedenis. Mededelingen van de ACM, 22(11), 594, 597.common ? 0.15 (boven 10k niveau)Industriële bronnen
Ik ben al eens geplooid. (2024). Wachtwoorden. https://haveibeenpwned.com/PasswordsSecundaire bronnen (context)
Troy Hunt. (2013). Inleiding 306 Miljoen gratis downloadbare Pwned Wachtwoorden. Troyhunt.com.Webbronnen geciteerd in de Time2Crack-toepassing
IEEE Xplore (dictionele referentie). https://ieeexplore.ieee.org/document/6234435descDict (app.js) voor de volgorde van dekking van topwoordenboeken.Document gegenereerd voor Time2Crack Project Versie 1.0 Versie 2026-04-01 Broncode:
app.js (functies addDictionaryAttacks, isDictWord, deLeet, loadDictionary, applyHighFidelityCalibration, bloomHas)