Qual è più veloce - forzatura bruta o utilizzo di un attacco dizionario che contiene tutte le possibili permutazioni?

7

Supponendo che una password di 6 caratteri utilizzi il set di caratteri mixalphanumeric, assegnando a ciascun carattere un set di caratteri di 62 e l'intera password uno spazio chiave di 62 ^ 6 = 46.6 miliardi (se i miei calcoli sono corretti). ..

Sarebbe più veloce forzare la password, o generare l'intero spazio per le chiavi in un dizionario e usare quel dizionario in un attacco di dizionario?

I due approcci sono considerati equivalenti o ci sarebbe una differenza nelle prestazioni? L'ultimo è spesso fatto? In caso contrario, perché no, e in tal caso, perché non è più comune?

Si noti che l'esempio citato è proprio questo, e la domanda che sto ponendo è una performance riguardante i due metodi, indipendentemente dallo spazio delle chiavi di una particolare password e dal tempo reale impiegato.

    
posta Hashim 05.03.2017 - 01:46
fonte

3 risposte

10

Non c'è differenza ... fino a quando non entri nelle implementazioni.

Piattaforme di cracking efficienti come hashcat e John the Ripper eseguono bruteforce direttamente su GPU / CPU utilizzando ottimizzazioni che le rendono molto più veloci di quelle che potrebbero essere inserite nel processo di cracking da un dizionario esterno.

La vera forza bruta e gli attacchi correlati (come gli attacchi basati su maschere e basati su regole) dovrebbero sempre essere più veloci di un puro attacco di dizionario.

Aggiornamento: la mia risposta si applica per gli hash veloci. Pascal ha ragione nella sua risposta che se l'hash è abbastanza lento, sarebbe lo stesso.

    
risposta data 05.03.2017 - 02:15
fonte
4

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.

    
risposta data 05.03.2017 - 20:50
fonte
2

Da un punto di vista dell'implementazione, è sicuro dire che sarà più veloce avere un algoritmo che sa che sta facendo forza bruta piuttosto che passare attraverso una tabella di ricerca uno per uno che aggiungerebbe intrinsecamente un sovraccarico di ricerca per ogni tentativo che non esisterebbe nel primo.

Il tuo algoritmo sarà più veloce nel forzare il brute nel codice con cicli nidificati, ad esempio, piuttosto che un passo in più per la ricerca (lettura su disco o lettura ram) per ogni tentativo.

    
risposta data 05.03.2017 - 02:43
fonte

Leggi altre domande sui tag