Attacco dizionario — Operazione completa

Documento di riferimento del progetto Time2Crack
Recipienti: sviluppatori, ricercatori di sicurezza, utenti avanzati

Contenuto

  • Panoramica
  • Sfondo storico e accademico
  • Fondazioni concettuali: perché i dizionari lavorano
  • Architettura di un moderno attacco dizionario
  • Il corpus di password reali
  • K-Anonymity HIBP verifica: un attacco in tempo reale
  • Time2Crack Language Wordlists
  • Detezione del dizionario in Time2Crack: isDictWord()
  • De-leetificazione: come l'attaccante decodifica le sostituzioni
  • Calcolo del tempo di cracking: addDictionaryAttacks()
  • Taratura ad alta fedeltà: applyHighFidelityCalibration()
  • Probabilità dell'applicabilità e del punteggio di fiducia
  • Filtro Bloom RockYou: rilevamento locale delle password diffuse
  • Confronto con attacchi derivati
  • Limitazioni del dizionario di attacco
  • Efficace difesa
  • Referenze

  • 1. Panoramica

    L'attacco del dizionario è il più antico metodo di cracking delle password, il più semplice concettualmente, e statisticamente più efficace sulla maggior parte delle password umane reali. Il suo principio è quello di testare, in ordine descrescente di probabilità, una lista pre-compilata di candidati — il "dizionario" — piuttosto che esaustivamente enumerate tutte le combinazioni possibili come la forza cruda fa.

    Perché è terribile efficace I decadi di perdite di dati rivelano che la distribuzione effettiva delle password è estremamente concentrata: le più comuni 1.000 password rappresentano circa il 5 al 10% di tutti i conti online. I più comuni 1 milione coprono 40 al 60%. Un attacco di dizionario ben costruito metterà alla prova questi candidati in millisecondi a secondi - dove la forza lorda richiederebbe milioni di anni.

    In Time2Crack, il dizionario attacca due meccanismi distinti ma complementari:

  • Verifica HIBP (Have I Been Pwned): Confronto della password al ~14 miliardi di credenziali uniche da perdite di dati storici. Se la password è lì, un aggressore lo scoprirebbe in una frazione di secondo.
  • Detezione Wordlist linguistica Una parola di lingua comune — "sun" o "sunshine" — è vulnerabile anche se non è in HIBP.
  • Queste due rilevazioni sono indipendenti e complementari: HiBP copre le credenziali di compromesso esatte, la lista dei testi copre le parole comuni non ancora trapelate.


    2. Sfondo storico e accademico

    2.1 Origini

    L'attacco del dizionario precede l'era moderna della sicurezza informatica. I primi sistemi Unix memorizzavano password in lingua normale in /etc/passwd, rendendo qualsiasi dizionario attacco banale non appena il file era accessibile.

    Cronologia delle pietre miliari : AnnoEvento ---------------- 1979Morris & Thompson: Primo articolo accademico sulla sicurezza delle password Unix. Vedi che 1/3 delle password scelgono parole in inglese comuni 1988Morris Worm: parzialmente si propaga tramite un dizionario 432 parola + host /usr/share/dict/words 1993Crack 5.0 (Alec Muffett): Primo strumento di attacco del dizionario pubblico su Unix, include le regole di mutazione 2000John the Ripper: popolarizza le liste di parole combinate con le regole di hashcat (modalità lista di parole + regole) 2009RockYou leak: 14,3 milioni di password chiare rivelano la reale distribuzione delle scelte umane 2012Have I Been Pwned (Troy Hunt): primo servizio di audit pubblico per le credenziali compromesse 2013Adobe break: 153 milioni di account — le password top diventano identificabili per analisi di frequenza anche su hash non salsi 2016Hashcat open source v3.0: ottimizzazione massiccia di attacchi wordlist su GPU (MD5: 2 TH/s su 8 cluster GPU) 2019Collezione #1–5: 2.7 miliardi di coppie di login/password compilate, distribuite pubblicamente 2024HIBP v8: ~14 miliardi di password uniche indicizzate

    2.2 Fughe di fondazione

    Alcune perdite hanno trasformato il paesaggio dell'attacco da dizionario rivelando la distribuzione effettiva delle password umane:

    RockYou (2009) Uno sviluppatore aveva memorizzato 14,3 milioni di password in lingua normale.
  • Le prime 10 password coperte ~5% di account
  • Prima 1.000: ~20% dei conti
  • La distribuzione segue una legge di potere — confermando che gli esseri umani "pensano lo stesso"
  • LinkedIn (2012) — 6,5 milioni di SHA-1 non salati. Adobe (2013) — 153 milioni di conti. I Been Pwned (2013–presente) - Aggregazione progressiva delle perdite pubbliche, permettendo a Troy Hunt di creare una base di riferimento utilizzata in tutto il mondo.

    2.3 Benchmark di riferimento per l'attacco del dizionario

    Una lista di 200.000 voci testate alla velocità di una RTX 4090:

    AlgoritmoVelocitàTempo per 200k candidati ----------------------------------------- MD5168.9 GH/s~1,2 nanosecondo SHA-150.86 GH/s~3.9 nanosecondi SHA-25622.68 GH/s~8.8 nanosecondi NT1288.5 GH/s~0,7 nanosecondo bcrypt (costo 5)184 kH/~1.09 secondo Argon2id~67 H/S- 50 minuti.

    L'attacco del dizionario è quindi quasi istantaneo per MD5, SHA-1 e NTLM — e rimane molto veloce anche per bcrypt su piccole liste.


    3. Fondazioni concettuali: perché i dizionari lavorano

    3.1 La legge di potere delle password umane

    Tutti gli studi empirici convergono verso la stessa osservazione: la distribuzione delle password umane non è uniforme — ne segue una legge del potere Alcune password concentrano una frazione sproporzionata di scelte.

    Formalmente : se tutte le password sono classificate in frequenza decrescente, la frequenza della password di grado R è proporzionale a (-α) con Da 1,5 a 2 Secondo il corpo.

    Di conseguenza diretta: 10 password più comuni Un aggressore che prova solo 10 candidati ha già una possibilità in 20 per avere successo - statisticamente, è enorme per la quantità di rumore generato.

    3.2 Bias cognitivo nella creazione di password

    Gli esseri umani non scelgono a caso, applicano sistematicamente euristiche che rendono prevedibili le loro password:

  • Memoria Bias : le parole facili da ricordare (nomi comuni, nomi, termini di cultura popolare) sono sovrarappresentate
  • Disponibilità Bias La password riflette l'ambiente immediato (nome animale domestico, squadra sportiva, carattere seriale)
  • Biasi di sostituzione prevedibile : "e" → "3", "a" → "@", "o" → "0" — l'utente ritiene che la password sia forte, ma queste sostituzioni sono esattamente il primo che l'attaccante cerca di fare
  • Bias completo : aggiunta di un numero o simbolo alla fine di una parola (password1, sole!)
  • Bias culturale Le password comuni sono collegate alla lingua e alla cultura dell'utente ("Soleil123" in Francia, "Sommer123" in Germania)
  • 3.3 Il concetto di "password già nelle liste"

    Una password può essere in un elenco di attacchi per due diversi motivi:

    Ragione 1 - È in HIBP Le credenziali esatte sono state compromesse in una perdita passata. L'attaccante non ha bisogno di indovinare - testa le credenziali conosciute una per una, in ordine di frequenza. Se il server di destinazione accetta le credenziali, è finito. Ragione 2 — È in una lista linguistica La password è una parola ordinaria di vocabolario comune. Anche se non è mai fuggito, è in tutte le liste di attacco perché è un candidato ovvio. "Paillon" non può essere in HiBP, ma è nella lista di parole francese di qualsiasi strumento di cracking serio.

    Questi due casi corrispondono ad attacchi di natura diversa, con velocità diverse — e questo è esattamente ciò che modelli Time2Crack.


    4. Architettura di un attacco dizionario moderno

    4.1 Condotto generale

    Un moderno attacco di dizionario avviene in diverse fasi:

    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: Wordlist Preprocessing - Ordina per frequenza (molto probabilmente prima) - Deduplicazione (non due volte lo stesso candidato) - - Filtrazione di lunghezza (lunghezza di punta + ±2) - Standardizzazione (caso inferiore, Unicode NFC)

    Fase 3: Calcolo delle ceneri dei candidati Per ogni candidato w nella lista delle parole: Normalmentecandidato = hashalgo(w) Promozionalecandidato= hashObiettivo : FIND - Velocità: 168 GH/s per MD5 su RTX 4090

    Fase 4: Analisi dei risultati Rapporto delle password incrinate, statistiche di copertura

    ottimizzazione hardware 4.2

    Gli attacchi di dizionario moderni sono massicciamente paralleli alla GPU:

  • Hashcat (strumento di riferimento): sfrutta i core CUDA della GPU per parallelizzare miliardi di calcoli simultanei di hash
  • Pipeline vettoriali : su un RTX 4090, un'unica istruzione SIMD calcola in parallelo da 8 a 16 hash MD5
  • cache GPU : la lista delle parole è caricata in VRAM per ridurre la latenza della memoria
  • Batching : i candidati sono inviati alla GPU in lotti di milioni per massimizzare il flusso
  • Per una lista di 14 miliardi di voci (dimensione HIP) su 12× RTX 4090:

  • MD5: 14e9 / (168.9e9 × 12) 6,9 secondi
  • bcrypt cost 5: 14e9 / (184000 × 12) 6.337 anni
  • Questa differenza di ~9 ordini di grandezza tra MD5 e bcrypt spiega perché la scelta dell'algoritmo hash è critica.

    4.3 Ordine di prova dei candidati

    La lista delle parole non è testata in ordine alfabetico — è ordinato per diminuire la probabilità :

  • Le password di fuga più comuni (RockYou top 100)
  • password comuni multi-fault (elenco prioritarioHIBP)
  • Parole comuni della lingua di destinazione
  • I nomi propri (primi nomi, città, celebrità)
  • Termini tematici correlati al target
  • Variazioni e coniugazioni
  • Questo tipo assicura che se la password è "bassa", si troverà nei primi millisecondi — qualunque sia la velocità hash.


    5. Il corpus delle password reali

    5.1 Sono stato pestato (HIBP)

    Dimensione ~ 14 miliardi di password uniche (2024) Fonte : aggregazione delle perdite pubbliche dal 2013 Formato : SHA-1 ordinato per frequenza di apparizione Accesso pubblico : k- anonimity API, full hash download disponibile per i difensori

    HiBP è il riferimento globale perché:

  • Esso copre quasi tutte le principali perdite pubbliche
  • Gli hash sono ordinati per frequenza — le password più comuni sono testate prima
  • È attivamente mantenuto (nuove perdite aggiunte continuamente)
  • Per gli algoritmi non salati (MD5, SHA-1), questa lista copre nell'ordine del 50-70% di tutte le password online reali.

    5.2 RockYou (2009) — Corpus fondatore

    Dimensione : 14,3 milioni di password chiare Caratteristiche principali : RankPasswordOccurrence% del corpus --------------------------- 1123456290 7312.03% 21234579 0780,55% 312345678976 7900,5% 4password59 del regolamento n.0.42% 5Ti amo.49 9520.35% Top 10—- 650.000~4.5% Top 100—1 200 000~8.4% 1 000—- 2 500 000~17,5% Top 10.000—4 500 000~ 31,5% Istruzione Prova solo 10.000 candidati (100 μs velocità MD5) compromessi ~31% di un database di conti protetti MD5.

    5.3 Collezioni di wordlist specializzati

    SecLismo (Daniel Miessler): raccolta open-source di ~4 GB wordlists che coprono:
  • Password (RockYou, password top varie perdite)
  • Usi correnti
  • Password ordinata per lingua
  • Termini tecnici, nomi dei prodotti, celebrità
  • Kaonashi : 1.3 miliardi di voci compilate dalla pubblica perdita Crackstation : 1,5 miliardi di voci comprese le parole di tutti i dizionari di Wikipedia in diverse lingue Weakpass : aggregazione di ~8 miliardi di singole password reali

    Questi corpi sono scaricabili pubblicamente — la loro esistenza è un fatto consolidato di sicurezza offensiva.


    6. K-anonimato verifica HIBP: un attacco in tempo reale

    6.1 Protocollo k- anonimato

    Time2Crack incorpora un controllo HIBP in tempo reale che riproduce esattamente ciò che un aggressore farebbe con il database HIBP — ma non trasmettere mai la password in lingua normale o il suo hash completo.

    Il protocollo k-anonymity funziona come segue:

    1. Calculer SHA-1(password)      → par exemple "CBFDAC6008F9CAB4083784CBD1874F76618D2A97"
    
  • Invia solo i primi 5 caratteri all'API HIBP: "CBFDA"
  • L'API restituisce tutti i suffissi SHA-1 a partire da "CBFDA" (circa 400-600 hashes)
  • Cerca localmente se il resto dell'hash ("C6008F9CAB4083784CBD1874F76618D2A97") è nell'elenco
  • Se trovato: la password è stata compromessa (HIBP restituisce anche il numero di perdite)
  • Garanzia di riservatezza Il server HIBP non vede mai l'hash completo (così non può identificare la password), figuriamoci la password chiara. Ciò che significa per l'attacco : se HIBP restituisce una corrispondenza con un alto conteggio (ad esempio 9,547,236 apparizioni per "123456"), questo significa che un aggressore con il database HIBP test questa credenziale lo troverebbe in una posizione molto alta sulla sua lista ordinati per frequenza — in una frazione di nanosecondi.

    6.2 Attuazione in Time2Crack (app.js)

    Il controllo HIBP è asincrono e non-bloccante. La password viene immediatamente analizzata dai metodi locali e il controllo HIBP completa il risultato:

    // 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
    

    risposta const = attendere fetch( https://api.pwnedpasswords.com/range/${prefix} ); const lines = attendere risposta.text();

    per (const line.split('\n') { const [hashSuffix, count] = line.split(':'); se (hashSuffix.toLowerCase() = suffisso.toLowerCase()) { ritorno parseInt(conto); // numero di perdite # # ritorno 0; // non trovato #

    Dati delle prestazioni HIBP :
  • Tipica latenza API: 50–200 ms (rete)
  • Volume di suffissi restituiti: ~400–600 per query
  • Falso positivo: 0 (SHA-1 è deterministico)
  • Falso negativo: 0 (se in HiBP, sempre restituito)
  • 6.3 Interpretazione del conte HIBP

    Il conteggio restituito da HiBP indica il numero di volte che questa password esatta è apparso in perdite indicizzate:

    ConteInterpretazioneTempo di scatto (MD5, 12× RTX 4090) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ > 1 000 000Top 100 Mondo< 1 nanosecondo 10.000–1.000Molto comune< 10 nanosecondi 1 000-10 000Comune< 100 nanosecondi 100-1.000Non comune ma conosciuto< 1 microsecondo 1-100Raro ma compromesso< 10 microsecondi

    Anche un conteggio di 1 (la password è apparsa solo una volta in una perdita) indica una vulnerabilità: se un aggressore punta specificamente questo account e ha l'elenco delle credenziali della perdita in questione, lo troverà.


    7. Time2Crack Language Wordlists

    7.1 Perché le liste linguistiche in aggiunta a HIBP

    HiBP copre le credenziali di compromesso esatte — ma non le parole comuni non sono mai scappate ancora. Un utente francofono che sceglie "effimero" come password non può essere in HiBP (la parola è improbabile nelle credenziali anglofono), ma è nella lista francese di qualsiasi attaccante che si rivolge a un sistema francofono.

    Le liste di parole di Time2Crack coprono questo divario:

    LinguaFonteDimensione stimata -------------------------------- IngleseSegreti Wikipedia EN~ 200.000 voci Francese (en)Segreti Wikipedia EN~ 150.000 voci SpagnoloSecLists Wikipedia ES~ 150.000 voci Portoghese (pt)SecLists Wikipedia PT~ 120.000 voci GermaniaWikipedia DE~ 180.000 voci Turchia (tr)SecLists Wikipedia TR~ 100.000 voci Italiano (it)kkrypt0nn~ 100.000 voci Polacco (pl)kkrypt0nn~ 80 000 voci Paesi Bassikkrypt0nn~ 80 000 voci Filtri applicati Vengono mantenute solo parole di ≥ 4 caratteri (i caratteri 1-3 sono troppo brevi per essere una password realistica, e la loro inclusione potrebbe gonfiare l'elenco senza valore aggiunto).

    7.2 Carico pigro

    Le liste di parole non sono incluse nel codice — sono caricate su richiesta durante la modifica del linguaggio, per soddisfare il budget della rete:

    // app.js - loadDictionary()
    async function loadDictionary(lang) {
      if (DICTlang & DICTWORDS) return;  // Déjà chargé
      if (DICTLOADING:
    DICTPENDINGLANG = lang; // file di attesa
    ritorno;
    #
    DICTLOADING = true;
    

    const res = aspetta fetch(data/wordlists/${lang}.txt); const text = attendere res.text();

    // Convertire in Impostare l'abbronzatura > per la ricerca O(1) DICTWORDS = nuovo set( text.split("\n") .map(w => w.normalize("NFC").trim().toLowerCase() .filter(w => w.length >= 4) ); DICTLANG = Lang; DICTLOADING = falso; #

    Perché Set ? Struttura Set JavaScript garantisce O(1) lookups — indipendentemente dalla dimensione del dizionario (50.000 o 200.000 voci), verifica DICTWORDS.has(word) prende lo stesso tempo costante. Array richiederebbe O(n) per ricerca, cioè fino a 200.000 confronti per controllo.

    Caricamento della coda

    The DICTFINELANG evita le condizioni di gara durante i rapidi cambiamenti linguistici:

    Scénario : l'utilisateur switche rapidement EN → FR → DE
    ├── EN demandé : DICTLOADING = falso → inizio della fetch EN
    FR richiesto durante la fessura EN : DICTLOADING = true → DICTFINELANG = "fr"
    ├── DE demandé pendant fetch EN : DICTLOADING = vero → DICTPENDINGLANG = "de" (crash "fr")
    - Taglie di chiusura: DICTLANG = "en", puis lance loadDictionary("de")
    └── Résultat : seule la dernière langue demandée est chargée

    Questo comportamento è intenzionale: la lingua più recente richiesta è caricata, non tutte le lingue intermedie.


    8. Rilevazione del dizionario in Time2Crack: isDictWord()

    8.1. Funzionamento di rilevamento

    La funzione isDictWord(pw) determina se una password è o deriva da una parola del dizionario corrente:

    // app.js - ligne 2181
    function isDictWord(pw) {
      if (!DICT(WORDS) restituisci falso;
    

    // Standardizzazione: NFC + minuscolo const l = pw.normalize("NFC"). toLowerCase();

    // Verifica diretta se (DICT)

    WORDS.has(l) || DICTWORDS.has(deLeet(pw)) ritorna vero;

    // Variazioni morfologiche const deleetWord = deLeet(pw); const variazioni = ottenereMorphVariations(deleetWord);

    per (variazione delle variazioni) { se (DICT)

    WORDS.has(variation)) return true; }

    ritorna falso; #

    Linea di rilevamento 3 strati :
  • Corrispondenza diretta : È la password standard nel dizionario come si trova?
  • "sun" → colpo diretto
  • "SOLEIL" → standard in "sun" → hit
  • corrispondenza post-leetificazione : La password contiene sostituzioni standard let?
  • "s0l3il" → deLeet → "sun" → hit
  • "p@ssw0rd" → deLeet → "password" → hit
  • Variazioni morfologiche : la password è una variante morfologica nota?
  • "sun" → variazione plurale di "sun" → hit
  • "passwords" → variazione di "password" → hit
  • 8.2 Standardizzazione Unicode (NFC)

    Standardizzazione normalize("NFC") assicura che i caratteri accentati siano trattati in modo coerente:

  • "e" può essere rappresentato in Unicode come un unico codice punto (U+00E9) o come "e" + combinazione accento (U+0065 + U+0301)
  • Senza standardizzazione, "coffee" e "coffee" (codifiche diverse) non corrisponderebbero
  • Questa standardizzazione viene applicata sia durante la creazione del dizionario che durante il controllo — assicurando la corretta corrispondenza per le lingue di accento (FR, ES, DE, PT, ecc.).

    8.3 Impatto sulla vulnerabilità rilevata

    Quando isDictWord() Torna indietro truediversi attacchi diventano applicabili:

  • Attacco dizionario auto: punteggio di fiducia 0.85 (vs 0 se assente)
  • Attacco ibrido : hybridVuln = true → 1000 mutazioni testate su base dizionario
  • Attacco PCFG : aumento del punteggio di fiducia (base rilevata)
  • Attacco morfologico : elevata priorità se la variante morfologica rilevata

  • 9. De-leetificazione: come l'attaccante decodifica sostituzioni

    9.1 Leetspeak e i suoi limiti come protezione

    Il leetspeak (o "1337 discorso") è una pratica di sostituzione di lettere con numeri o simboli visivamente simili: a→@e→3i→1 o !o→0s→$. Gli utenti lo usano per "strengthen" parole comuni.

    Esempio : "password" → "p@$$w0rd"

    La realtà: queste sostituzioni sono le prime regole applicate non costituiscono una vera difesa contro un aggressore competente.

    9.2 Attuazione deLeet() in Time2Crack

    // app.js - ligne 3622
    const LEETBASE = {
    a: ["@", "4"],
    e: ["3"]
    ["0"]
    ["$", "5"],
    ["+", "7"],
    #
    g: ["9"]
    }
    

    funzione diLeetWith(pw, oneMap) { let r = pw.normalize("NFC"). toLowerCase(); per (const [ch, reps] di 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; }

    funzione diLeet(pw) { // Ambiguità: "1" può essere "i" o "l" const withI = deLeetWith(pw, { i: "1!", l: "" }); const withL = deLeetWith(pw, { l: "1", i: "!" });

    // Se il dizionario è caricato, preferire la variante che corrisponde se (DICT)WORDS) se (DICT)WORDS.has(withL) ritorno conL; se (DICT)WORDS.has(conio) ritorno conI; #

    // Altrimenti: preferire la variante con i numeri meno rimanenti const digestsI = (con I.match(/\d/g) const digestsL = (con L.match(/\d/g) cifra di ritorno L <= cifre I? conL: withI; #

    9.3 Gestione dell'ambiguità "1" → "i" o "l"

    La sostituzione "1" è ambigua: "1" può rappresentare "i" (come in "1nfo" → "info") o "l" (come in "p1ayer" → "player").

  • Testare entrambe le varianti ("withI" e "withL")
  • Se il dizionario è caricato, preferendo la variante che dà una corrispondenza del dizionario
  • Senza un dizionario, preferendo la variante che lascia i pochi numeri residui (supposizione: la de-leetificazione completa è più probabile)
  • Esempio :
  • "b1ue" → conI = "biue" (non in dict), conL = "blu" (in dict) → restituisce "blu"
  • "f1le" → withI = "file" (in dict), withL = "flle" (non in dict) → restituisce "file"
  • 9.4 Sostituzioni non coperte (intenzionalmente)

    Time2Crack non copre sostituzioni rare o ambigue oltre i modelli LEETBASE. È una scelta di progettazione: coprire troppi casi aumenterebbe i falsi positivi (rilevando una password come "parola corrente" mentre non lo è).


    10. Calcolo del tempo di cracking: addDictionaryAttacks()

    Logica di calcolo

    // 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 = debole ? t("nWeakPassword") : comune ? : dictWord? t(nDictHit) : t(nAbsentLeaks);

    righe.push({ atk: t("aDict"), hash: a.name, milza: a.rate, sec, note, cat: "dict" }); # #

    10.2 Tre livelli di vulnerabilità

    Livello 1 — Ultra debole (weak = true) La password è nella top 100 del mondo ("password", "123456", "qwerty"...). Un attaccante che testa questi 100 candidati prioritari lo trova nel primo passaggio. 0.6 nanosecondo. Livello 2 — Comune (common = true) : La password è nell'elenco HIBP di riferimento delle ~10.000 password più frequenti. Questi candidati sono testati nei primi microsecondi. 59 nanosecondi. Livello 3 — DictWord (dictWord = true) : La password è una parola dell'attuale dizionario di lingua (lista di parole locale ~50k–200k voci). Una scansione completa della lista di parole è quasi istantanea per algoritmi veloci. 1.18 microsecondo. Livello 4 — Non applicabile (sec = null) : la password non è né ultra-debole, né comune, né una parola dal dizionario corrente. L'attacco del dizionario da solo non è applicabile — altri attacchi (forza di gravità, Markov, PCFG) diventano la minaccia principale.

    10.3 Perché questi numeri (100, 10.000, 200.000)?

    Questi valori vengono calibrati ai dati effettivi:

  • 100 Le prime 100 password RockYou rappresentano il ~10% del corpus. Tutti gli strumenti gravi li testano come una priorità.
  • 10 000 : HiBP ordina i suoi ~14 miliardi di voci per frequenza. La top 10.000 copre circa il 30-40% delle password reali in uso. Qualsiasi attaccante competente inizia con questo sottoinsieme.
  • 200 000 : dimensioni tipiche di un elenco di parole completo dopo il filtraggio, sufficiente per coprire il vocabolario attuale di una lingua senza superare la ragionevole capacità di carico nella memoria.
  • Riferimento Weir et al. (2009) mostrano che le parole del dizionario si trovano nei primi 200.000 tentativi di un attacco ben ordinato. Ur et al. (2012) confermano che le password comuni si trovano nei primi 10.000 tentativi.

    10.4 Esempio numerico completo

    Per la password "sun" (attuale parola francese, rilevata come dictWord)

    AlgoritmoVelocità (12× RTX 4090)FormulaTempo ------------------------------------------- NT13.462 GH/s200 000 / 3 462e957.8 picosecondi MD52 027 GH/s200 000 / 2 027e998.7 picosecondi SHA-1610 GH/200 000 / 610e9327.9 picosecondi SHA-256272 GH/200 000 / 272e9735 picosecondi bcrypt (costo 5)2.2 MH/s200 000 / 2 200 00090,9 millisecondi Argon2id800 H/s200 000 / 800250 secondi

    Anche per Argon2id, 250 secondi è meno di 5 minuti — per una parola semplice dal dizionario francese.


    11. Alta taratura di fedeltà: applyHighFidelityCalibration()

    11.1 Perché la calibrazione aggiuntiva?

    Il calcolo lordo addDictionaryAttacks() dà una stima del "caso peggiore" — come se l'attaccante stava testando l'intera lista di parole in modo uniforme. ordinato per probabilità : le password più comuni arrivano prima.

    La taratura di alta fedeltà applica un moltiplicatore correttivo basato su osservazioni empiriche:

    // 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 = contesto.common ? 0.15: context.dictWord? 0.5: 1.0;
    Rompere;
    Multiplo common (0.15) : se la password è nell'elenco delle priorità comuni, si trova in media al 15 ° percentile della lista — cioè ~ 1.500 test dei 10.000 elencati. Il tempo è moltiplicato per 0.15 → 6.7× più veloce della scansione uniforme. Multiplo dictWord (0.5) : una parola comune del dizionario si trova in media a metà termine di una lista ben ordinata. Multiplier 0.5 → 2× più veloce della scansione uniforme.

    11.2 Fonti accademiche di calibrazione

  • (2012) — Come si misura la tua password? (USENIX Security): analisi della distribuzione delle password in vero corpus. Parole comuni: trovate nelle prime 10.000 prove per il 95% dei casi.
  • Weir et al. (2009) — Password Cracking Utilizzo di Grammatica Probabilistica Senza Contesto (IEEE S&P): Le parole del dizionario puro si trovano nelle prime 200.000 prove di un attacco ordinato.

  • 12. probabilità di applicabilità e punteggio di fiducia

    12.1 Sistema di punteggio

    Time2Crack non solo calcola un tempo — valuta anche la probabilità che l'attacco del dizionario sia effettivamente l'attacco più veloce, tramite un sistema di punteggio multifattore:

    // Score d'applicabilité (0-1)
    case "dict":
      return context.common ? 0.99 : context.dictWord ? 0.85 : 0;
  • 0,9 se common La password è in HIBP → l'attacco del dizionario si applica con la massima fiducia.
  • 0.85 se dictWord Una parola del dizionario è vulnerabile, ma un attaccante deve avere la giusta lista linguistica.
  • 0 Altrimenti: l'attacco del dizionario non si applica (nessuna vulnerabilità lessicale rilevata).
  • 12.2 Punteggio delle prove

    Parallelamente al punteggio di applicabilità, un punteggio "evidence" registra i segnali osservati:

    case "dict":
      return Number(!!context.common) + Number(!!context.dictWord);
      // 0 : aucun signal
      // 1 : un signal (common OU dictWord)
      // 2 : deux signaux (common ET dictWord)

    Un punteggio di prova di 2 (parola sia in HIBP che nel dizionario linguistico) aumenta la fiducia finale di 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
    

    Row.confidence = Math.max(0, Math.min(1, Math.max (applicabilità, base) + evidenzaBoost - specificPenalty )

    Per una password common con dictWord anche rilevato:

  • applicability = 0.99
  • evidenceBoost = min(0.12, 2 × 0.04) = 0.08
  • confidence = min(1, max(0.99, 0.6) + 0.08) = min(1, 1.07) = 1.0
  • Massima fiducia: L'attacco del dizionario è l'attacco primario senza ambiguità.


    13. Filtro Bloom RockYou: rilevamento locale di password diffuse

    13.1 Sfondo

    Oltre alla verifica HIBP (che richiede una chiamata di rete), Time2Crack incorpora una filtro della fioritura Un filtro di fioritura è una struttura dati probabilistica che consente di testare l'appartenenza a un insieme con una probabilità di falsi positivi (~1%), senza memorizzare gli elementi stessi.

    13.2 Vantaggi del filtro della fioritura

    CriteriHIBP k- anonimitàFiltro Bloom locale ------------------------------------- Copertura14 miliardi~ 14 milioni (RockYou) Lattice50-200 ms (rete)<1 ms (locale) Riservatezzak- anonimità (5 serbatoi SHA-1)100% locale, nulla trasmesso Falso positivo0%~1% ~ DimensioneAPI~2–5 MB (filtrato di sangue binario)

    13.3 Funzionamento della doppia copertura

    // app.js - ligne 1962
    function bloomHas(filter, word) {
      if (!filter) return false;
      const { bitArray, m, k } = filter;
      const w = word.toLowerCase();
    

    // Doppio taglio: h1 e h2 sono due funzioni di hash indipendenti const h1 = fnv1a32(w, 2166136261); // FNV1a con seme standard const h2 = fnv1a32(w, 0x811c9dc5); // FNV1a con seme alternativo

    per (let i = 0; i < k; i++) { const pos = (h1 +) (h2) > (0)) % m; // k posizioni nella matrice bit const byteIdx = Math.floor(pos / 8); const bitIdx = pos % 8;

    // Se un po' è 0: la parola è DEFINITLY assente se ((bitArray[byteIdx] & (1 <± bitIdx) = 0) restituisci falso; # // Tutti i bit sono a 1 : la parola è PROBABLY presente (con 1% di FP) ritorno vero; #

    Il double-hashing FNV1a garantisce una distribuzione uniforme delle posizioni nell'array bit, minimizzando le collisioni e mantenendo il tasso di falsi positivi vicino all'1%.

    13.4 Carico e format binario

    Il filtro della fioritura è memorizzato in data/rockyou.bloom — un file binario con:

  • Intestazione (20 byte): numero magico (0x424c4f4f = "BLOO"), versione, m (bit array size), k (numero di funzioni hash), n (numero di elementi)
  • Pagamento : bit array (m/8 byte)
  • Il carico viene attivato manualmente dall'utente (pulsante nell'interfaccia utente), non automaticamente al caricamento della pagina, per preservare le prestazioni iniziali.


    14. Confronto con attacchi derivati

    Time2Crack implementa 7 modelli di cracking offline (forza di crescita, dizionario, ibrido, maschera, PCFG, Markov, combinatore), ogni attacco della password da un angolo diverso.

    14.1 Dizionario vs ibrido

    CriteriDizionarioIbrido (dict+rules) ---------------------------------- CandidatiDizionario parole comeParole + ~ 1000 mutazioni per parola Spazio chiave200.000 candidati- 200 milioni di candidati Esempi schiacciati"password", "sun""P@ssw0rd!", "s0l3il2024" Velocità relativa1000× più veloceCopertura molto più ampia Applicabile separola esatta nella listaPassword derivata da una parola detta

    L'attacco ibrido inizia dove il puro dizionario si ferma: prende ogni parola dalla lista delle parole e applica regole di mutazione sistematiche (hashcat "best64.rule" in mente).

    Dizionario 14.2 vs PCFG

    CriteriDizionarioPCF --------------------- ModelloElenco fisso dei candidatiStruttura probabilistica grammatica ForzaParole preciseStrutture Word+Digits, Cap+lower+sym Esempio"password" → ✓"Password123" → ✓ (struttura rilevata) CoperturaVocabolario conosciutoStrutture umane generiche

    Una password come "Password123" può andare inosservata in un dizionario (la parola esatta "Password123" non può essere elencato) ma sarà cracked molto rapidamente da PCFG che riconosce la struttura [Majuscule][minuscules][digits].

    14.3 dizionario vs Markov

    CriteriDizionarioMarkov ----------------------- CandidatiElenco precompilatoVolare generato da modello statistico CoperturaVocabolario conosciutoQualsiasi probabile sequenza "umano" VantaggioMolto veloce su parole esatteCopre le parole di vocabolario sconosciute Esempio"sunshine" → ✓"sunsh1ne" potenzialmente ✓

    Markov copre casi in cui la password sembra una parola umana senza essere in alcuna lista.

    14.4 dizionario vs Credential Stuffing

    CriteriDizionarioCredential Stuffing ------------------------------ ObiettivoCracking un hashProvare un login specifico Meccanismocomputazione locale Hashtentativi di connessione remota FonteWordlist genericoCoppia perdite di login/password DifesaForte algoritmo di hashTasso di limitazione, MFA, blocco IP

    L'imbottitura Credenziale non attacca un hash — prova direttamente coppie di login/password su servizi remoti. È concettualmente diverso da cracking, ma condivide la stessa fonte di dati (HIBP/fail).


    15. Limitazioni del dizionario di attacco

    15.1 Limiti intrinseci

    1. vocabolario conosciuto solo Una parola d'ordine inventata che non assomiglia a nessuna parola esistente e non è in HiBP è impervioso per puro attacco di dizionario. "Xqz7mK9pL" non sarà mai in nessuna lista di parole. 2. Copertura linguistica Un aggressore che si rivolge a un utente francofonico senza una lista di parole francese mancherà parole come "effimero", "grenouille", o "bricolage" che non sono nelle liste di parole standard inglesi. 3. Nuove password Una credenziale che è appena stata creata e non è mai fuggita non sarà in HiBP — anche se è molto comune, dovrà aspettare fino alla prossima perdita per trovarlo. 4. password molto lunghe Una password composta da una frase lungamente inventata ("MaGrandeAventure2024SousLesEtoiles") non sarà in nessuna lista di parole — anche se ogni parola presa separatamente è banale.

    15.2 Che Calcolo di Time2Crack non Modello

    Context Wordlists : un attaccante che si rivolge a un settore specifico costruirà liste di parole adattate (parole mediche per ospedali, slang di videogiochi per piattaforme di gioco). La forza lorda combinata : Strumenti come CeWL (Custom Word List Generator) possono estrarre i termini dal sito web di destinazione per costruire una lista di parole personalizzata. Ultime perdite non ancora in HIBP tra il momento in cui si verifica una perdita e la sua integrazione in HIBP, le credenziali compromesse circolano in forum privati senza essere accessibili tramite l'API pubblica. Algoritmi Hash non coperti Time2Crack modelli 6 algoritmi (MD5, SHA-1, SHA-256, NTLM, bcrypt, Argon2id).

    16. Efficace difesa

    16.1 Che cosa protegge contro l'attacco del dizionario

    Moderno algoritmo di hash (bcrypt, Argon2id) Questa è la difesa più efficace sul lato server.
  • MD5: crack in ~1 microsecondo
  • bcrypt cost 12: crack in 35 ore
  • Argon2id (parametri consigliati): crack in anni
  • La differenza di 10+ ordini di grandezza tra MD5 e Argon2id rende la password del dizionario "sun" immune in pratica se protetta da Argon2id - anche se l'aggressore sa che è una parola francese.

    Sale singolo per conto Un sale impedisce attacchi da tavolo precalcolati e costringe l'attaccante a ricalcolarsi individualmente per ogni conto. Non protegge attacchi di wordlist mirati (l'attaccante può ancora testare le 200.000 parole con il sale), ma invalida i tavoli dell'arcobaleno e fa attacchi di massa su grandi database impraticabili. Lunghezza della password Una password di una sola parola del dizionario (8-10 caratteri) è vulnerabile. Una frase di 4-5 parole ("cheval-lumière-forest-voyage") è resistente all'attacco del dizionario puro, ma non all'attacco Combinator — da qui l'importanza della lunghezza E la casualità. Password generate casualmente La soluzione reale: utilizzare un password manager che genera password casuali lunghe (20+ caratteri di tutti i tipi), queste password non saranno mai in alcun dizionario. Autenticazione multifattore (MFA) L'MFA non impedisce la crepa offline (l'attaccante recupera hash e crepe offline), ma protegge contro l'imbottitura delle credenziali (utilizzare le credenziali cracked per connettersi). Tasso di limitazione e rilevazione delle anomalie Protegge dagli attacchi online (dei tentativi di connessione diretta), non contro il cracking offline di hash rubati.

    16.2 Che cosa non protegge

    Sostituzioni dei piedi semplici : "password" → "p@ssw0rd" — vedi sezione 9. Numeri aggiunti alla fine : "password" → "password1" — tra le prime regole testate. Pagamento iniziale : "password" → "Password" — regola di capitalizzazione standard. Figure e simboli se la parola rimane riconoscibile "sunshine!" è in qualsiasi wordlist che include "sunshine" con regole di base. Complessità imposta senza lunghezza "P@s1w" soddisfa i criteri di complessità (maj, min, numero, simbolo) ma è più breve e più prevedibile di "corsebaterystaple corretto".

    16.3 Raccomandazioni pratiche

  • Utilizzare un password manager (Bitwarden, 1Password, KeePass) — genera password casuali, devi solo ricordare la password principale.
  • Abilitare MFA ovunque — anche se la password è compromessa, l'attaccante non può connettersi.
  • Controllare HIBP regolarmente — se la sua e-mail è in perdite conosciute.
  • Non riutilizzare mai una password — l'imbottitura delle credenziali sfrutta il riutilizzo dei cross-services.
  • Per memorizzare le password : 5+ parole casuale (non "corse-correct-battery-agrafe-violet" ma parole davvero disegnate da lotto).

  • 17. Riferimenti

    Fonti primarie (studi accademici)

    Morris, R., & Thompson, K. (1979). Sicurezza della password: Una storia del caso. Comunicazioni dell'ACM, 22(11), 594-597.
  • Prima analisi accademica della distribuzione di password Unix
  • Riconosce che ~1/3 password sono parole in inglese comuni
  • Klein, D.V. (1990).
    Foiling il cracker: Un sondaggio di, e miglioramenti a, sicurezza password. Procedimenti di sicurezza UNIX, 5-14.
  • 15.000 Unix password crack: 25% incrinato in poche ore
  • Documento prima wordlist e regole di mutazione
  • Weir, M., Aggarwal, S., de Medeiros, B., & Glodek, B. (2009).
    Crepazione di password utilizzando le grammatica probabilistiche senza contesto. Simposio IEEE sulla sicurezza e sulla privacy.
  • Riferimento di base su attacco PCFG e confronto con attacco di dizionario puro
  • Determina che le parole del dizionario si trovano nei primi 200.000 tentativi di un attacco ordinato
  • Citato in Time2Crack per la taratura HF dell'attacco del dizionario (multiplier 0.5)
  • Ur, B., Kelley, P. G., Komanduri, S., Lee, J., Maase, M., Shay, R., Vaniea, K., Bauer, L., & Cranor, L. F. (2012).
    Come si misura la password? L'effetto dei metri di forza sulla scelta Password-User. 21st USENIX sicurezza simposio.
  • Analisi della distribuzione delle parole comuni in vero corpo
  • Parole comuni trovate nei primi 100–10 000 tentativi
  • Citato in Time2Crack per calibrazione HF common ? 0.15 (alto livello 10k)
  • Bonneau, J (2012).
    La scienza del canto: analizzare un corpus anonimo di 70 milioni di password. Simposio IEEE sulla sicurezza e sulla privacy.
  • Studio di 70 milioni di password anonimete Yahoo
  • Quantificare la distribuzione effettiva delle password, conferma la legge di potere
  • Misurare l'efficacia dell'imbottitura delle credenziali (2–5% di tasso di successo sui conti reali)
  • Ma, J., Yang, W., Luo, M., & Li, N. (2014).
    Uno studio sui modelli di password probabilistici. Simposio IEEE sulla sicurezza e sulla privacy.
  • Comparazione dei modelli probabilistici (dizionario, Markov, PCFG) su vero corpus
  • Best64.rule priorità → ~40% riduzione del tempo medio per le parole del dizionario
  • Citato in Time2Crack per calibrazione HF di attacco ibrido
  • Wheeler, D.L. (2016).
    zxcvbn: stima della forza della password a basso costo. 25° Simposio di sicurezza USENIX, 157–173.
  • Sistema di stima della forza utilizzando wordlist e modelli
  • Analisi dei pregiudizi cognitivi nella creazione di password
  • Misurare l'efficacia delle liste di parole in relazione alla forza lorda
  • Pasquini, D., Cianfriglia, M., Ateniese, G., & Bernaschi, M. (2021).
    Ridurre i pregiudizi nella modellazione della forza della password del mondo reale attraverso l'apprendimento profondo e dizionari dinamici. 30 ° Simposio di sicurezza USENIX.
  • Valutazione dei modelli di stima per attacchi effettivi
  • Conferma che i dizionari rimangono lo strumento più efficace per le password umane comuni
  • Fonti industriali

    Sono stato pestato. (2024).
    Password. https://haveibeenpwned.com/Passwords
  • Basi di ~14 miliardi di password uniche da perdite documentate
  • k- anonimity API utilizzato da Time2Crack per la verifica in tempo reale
  • Hive Systems. (2025).
    2025 Hive Systems Password Table.
  • Benchmarks 12× RTX 4090: MD5 2,027 GH/s, NTLM 3,462 GH/s, bcrypt cost 5: 2,2 MH/s
  • Principale fonte di hash tassi utilizzati in Time2Crack
  • Hashcat. (2025).
    Hashcat — Recupero password avanzata.
  • Strumento di riferimento per i benchmark GPU
  • Documentazione delle regole di mutazione (best64.rule, OneRuleToRuleThemAll)
  • Gosney, J (2012).
    Striature su Lee et al. e Probabilistic Password Cracking. Procedura di password.
  • Primo pubblico documentato multi-GPU benchmark
  • Riferimento per la calibrazione degli attacchi basati sulle regole
  • Miessler, D. (2024).
    SecLists — Una raccolta di più tipi di elenchi utilizzati durante le valutazioni di sicurezza. GitHub.
  • Fonte delle liste di parole di Wikipedia utilizzate in Time2Crack
  • Elenco delle parole in inglese, francese, spagnolo, portoghese, tedesco, turco
  • Fonti secondarie (contesto)

    Troy Hunt (2013).
    Introduzione 306 milioni di password Pwned scaricabili gratuitamente. troyhunt.com.
  • Stabilimento iniziale del servizio HIBP e spiegazione del protocollo k-anonymity
  • Thomas, K., et al. (2019).
    Proteggere gli account da un'imbottitura delle credenziali con avviso di rottura password. 28 ° Simposio di sicurezza USENIX.
  • Studio di Google/Stanford sulla protezione delle credenziali compromesse
  • Conferma l'efficacia di k-anonymity come meccanismo di privacy
  • Wang, D., Cheng, H., Wang, P., Huang, X., & Jian, G. (2016).
    La legge di Zipf nelle password. IEEE Transazioni sulla forense dell'informazione e sulla sicurezza, 12(11), 2776–2791.
  • formalizzazione matematica del diritto di potere nella distribuzione delle password
  • Conferma che la distribuzione Zipf detiene su tutti i grandi corpus conosciuti
  • Fonti web citate nell'applicazione Time2Crack

    IEEE Xplore (riferimento preventivo). https://ieeexplore.ieeee.org/document/6234435
  • Fonti correlate descDict (app.js) per l'ordine di copertura di top dizionari.
  • HIBP API range (k- anonimity). https://api.pwnedpasswords.com/range/
  • Endpoint effettivamente utilizzato da Time2Crack per la verifica k-anonymity (domanda di prefissosha1).
  • HIBP call pattern in codice. https://api.pwnedpasswords.com/range/${prefix}
  • La forma esatta dell'URL chiamato negli esempi di codice del documento (prefisso SHA-1 interpolato).

  • Documento generato per Time2Crack Project — Versione 1.0 — 2026-04-01 Codice sorgente: app.js (funzioni addDictionaryAttacksisDictWorddeLeetloadDictionaryapplyHighFidelityCalibrationbloomHas*