Qualsiasi risposta significativa dovrà tenere conto di alcune specifiche, ad esempio quale funzione hash è stata utilizzata per proteggere le password.
Se hai creato un dizionario di tutte le possibili combinazioni di password, iniziando con "111111" e finendo con "zzzzzz" (assumendo solo lettere maiuscole, lettere minuscole e cifre), e non ordina questo dizionario in base alla verosimiglianza della password, ma conservalo in ordine lessicografico, la domanda diventerebbe più rapida, inserendo queste stringhe di dizionario nel tuo indovino della password o facendo in modo che le password indovinino creino le combinazioni al volo.
Per rispondere a questa domanda, dobbiamo sapere dove archiviamo il nostro dizionario, che è abbastanza grande da non poter essere inserito interamente nella memoria, quindi dovremo memorizzarlo su un disco rigido.
È anche importante sapere che i dischi rigidi (la variante del disco rotante magnetico, comunque) hanno tempi di accesso nell'intervallo del millisecondo. La RAM è più veloce di ordini di grandezza, ma è ancora lento rispetto alla cache L1, che di nuovo è molto più lenta dell'accesso diretto al registro in una CPU. Sfortunatamente, i registri CPU generici possono memorizzare solo 128 byte in totale e la cache L1 memorizza solo alcuni kb in totale.
Anche in questo caso, supponendo che tu stia lavorando con un computer con 8 GB di memoria riservata, puoi mantenere circa 1 miliardo di voci del dizionario nella RAM contemporaneamente. Questo è circa il 2% dell'intero spazio della chiave.
Se caricassi il dizionario dal disco rigido, avresti bisogno di caricare un totale di 325 gigabyte di dati (in fusti di almeno 4 GB ciascuno - caricheresti sempre 4 GB di password mentre provi le password nel altri 4 GB). Anche con gli SSD, ci vorrebbe un po '.
Ora, se avessi a che fare con una funzione di hash come md4, hashcat esaurirebbe facilmente le tue password candidate prima di poter caricare il batch successivo, perché su una GPU moderna può letteralmente testare miliardi di password al secondo. In pratica, non è possibile caricare le password candidate velocemente dal disco rigido. D'altra parte, se stavi cercando di attaccare password crittografate con una funzione di hash come bcrypt, caricare le password candidate dal disco rigido non avrebbe nemmeno intaccato il tempo necessario per attaccare con successo la password, perché anche le moderne GPU non possono bcrypt abbastanza veloce da esaurire 500 milioni di candidati prima che i prossimi 500 milioni possano essere caricati dal disco rigido.
Vediamo se creare le password al volo, invece di caricarle nella RAM in enormi blocchi, sarebbe più veloce:
Le CPU hanno alcune proprietà interessanti. Ad esempio, usano il prefetch delle istruzioni, la previsione dei rami e l'esecuzione provvisoria per eseguire il codice prima che sia effettivamente noto se debba essere eseguito o meno. Insieme alla cache della CPU, questo significa che se si esegue un codice molto piccolo e stretto, come il codice per enumerare tutte le possibili combinazioni di una data lunghezza di bit, può fondamentalmente funzionare interamente nella CPU, senza mai toccare (lento) RAM . Piccole password (6-8 byte) si adattano facilmente in un unico registro CPU, le password da 16 byte si adattano ancora a due registri. Il codice per produrre la prossima password candidate dall'ultima è semplice come usare un'istruzione "add", che è una delle istruzioni della CPU più veloci che ci siano. Quindi sono abbastanza fiducioso che potresti generare ogni combinazione di password molto più velocemente di quanto potresti caricare l'intero elenco da una fonte esterna.
Ma ancora una volta, il tempo necessario a una CPU (o GPU) per calcolare un hash di bcrypt effettivo da confrontare con una password con hash ridurrebbe il tempo necessario per generare le password candidate.
Quindi il metodo di generazione della password non è così importante per le password ben protette. Importa solo quando si ha a che fare con funzioni hash deboli o molto veloci come md4, md5, sha1 ecc.
Conclusione
Se si presuppone che ogni password sia ugualmente probabile, quindi generare tutte le password una dopo l'altra (forzatura bruta) al volo ha più senso, perché non sarà necessario conservare enormi dizionari sul disco rigido. Puoi crearli più velocemente al volo. Questo è il motivo per cui nessuno mantiene i dizionari di password non ordinati sui propri dischi rigidi per stupidi forzanti bruti.
D'altra parte, se ammetti che alcune password (pensate che "123456" e "password" siano più simili di altre (si pensi "1qHGmR"), quindi creando un dizionario di queste password e caricando quel dizionario nella RAM, e magari usando alcune regole per creare derivati come "sarah1997" e "sarah1998" dalla voce del dizionario di base "sarah", è la strada da percorrere, perché sarà sempre molto più veloce.
Detto questo, se hai effettivamente a che fare con 6 password di lettere e una debole funzione di hash, non importa molto in entrambi i modi, perché hashcat e compatrioti possono esaurire uno spazio di 6 caratteri con la forza bruta in pochi minuti, ore o giorni, a seconda della funzione di hash utilizzata e della potenza della piattaforma GPU disponibile.