Implementazione degli attacchi di forza bruta sui valori di hash in Javascript

3

Sto lavorando per la mia tesi di laurea, alla fine della quale tento di implementare un hash cracker basato su Javascript e proof-of-concept. L'idea è di lavorare in questo modo: gli utenti possono inviare un valore hash insieme alle informazioni sull'algoritmo utilizzato. (Altro) gli utenti possono anche fare clic su un pulsante sul sito Web per partecipare al processo di cracking. Il compito del server è quello di accettare e dividere gli ordini "inviati" in intervalli, a seconda del numero di lavoratori disponibili. Gli intervalli vengono quindi inviati ai clienti che hanno fatto clic su detto pulsante.

Attualmente sono bloccato con la grande domanda su come implementare realmente questa funzione di forza bruta. Quindi il mio problema principale ora è che, francamente, non sono ancora così deciso in Javascript. Per i principianti, vorrei solo usare un set di caratteri con codice fisso: alfanumerico, minuscolo e maiuscolo, senza caratteri speciali. Il problema è che non ho assolutamente alcun indizio su come implementare realmente la funzione che proverebbe tutte le combinazioni di caratteri, su come programmarlo. Posso immaginare di usare un normale array contenente il set di caratteri, quindi due stringhe. Una stringa dovrebbe contenere l'intervallo, l'altra conterrà le combinazioni provate. Quindi dovrei in qualche modo ripetere l'array charset e le stringhe magari con loop-in-loop o qualcosa del genere, ma sono davvero bloccato con la domanda di "come" esattamente :). Non mi aspetto che qualcuno di voi mi fornisca effettivamente il codice sorgente completo per tale funzione (a meno che non lo si voglia, ovviamente), ma apprezzerei davvero alcuni suggerimenti o spiegazioni su come implementare una tale funzione di forza bruta. A questo punto non mi preoccuperei nemmeno delle prestazioni o della codifica ottimizzata, ma piuttosto della codifica completa o di qualsiasi altra cosa si voglia chiamare.

    
posta slagjoeyoco 05.09.2012 - 18:44
fonte

2 risposte

3

Definire innanzitutto lo spazio delle potenziali password. Quindi numerali in sequenza.

Ad esempio, supponiamo di definire le possibili password come "sequenze di otto lettere e cifre". Questo è un alfabeto di 62 segni (26 lettere minuscole, 26 lettere maiuscole, 10 cifre). Quindi ci sono 62 8 = 218340105584896 password da provare. Le password sono facilmente mappate su numeri interi nell'intervallo 0..218340105584895 considerando le password come rappresentazioni di base 62 (ad esempio 'a' è 0, 'b' è 1, ... 'z' è 25, 'A' è 26, ... 'Z' è 51, '0' è 52 ... e '9' è 61). Ora che le potenziali password sono solo numeri interi in una sequenza consecutiva, è facile distribuire gli intervalli.

Naturalmente, le prestazioni della funzione di hash implementate in Javascript saranno molto deludenti. Un singolo PC con una buona GPU può provare più password MD5 di 1000 client che utilizzano Javascript. Potresti voler creare versioni che usano Java e / o .NET (Silverlight): questi linguaggi di programmazione hanno molti più muscoli (non abbastanza buoni come C, ma almeno nello stesso ordine di grandezza).

Modifica: dal tuo commento, mi risulta che desideri mantenere l'hash di destinazione in qualche modo privato e non inviarlo alle macchine che fanno cracking. Ciò costringe le macchine di cracking a ritrasferire tutti i loro hash (o parte di essi) al server, e si avrà un problema di larghezza di banda. Ciascuna macchina di cracking potrebbe inviare indietro, ad esempio, solo i primi due byte di ciascun hash calcolato; il server quindi sa quali candidati di password corrispondono all'hash di destinazione sui primi due byte. Ciò ridurrebbe il problema di un fattore 65536, e quindi il server può terminare il lavoro stesso (testando nuovamente i candidati corrispondenti sulla propria CPU). Tuttavia, con una larghezza di banda in ingresso di 10 MByte / s, potresti ricevere solo circa 5 milioni di hash al secondo e se scegli un hash "semplice" (come una singola iterazione di MD5), allora questa è una prestazione molto scarsa ( il solo server, sulla propria CPU, può testare molte più password al secondo). Questo sarebbe uno schema valido per un hash lento (come bcrypt ) dove ogni cracking sarà essere in grado di calcolare al massimo un centinaio di hash al secondo (ma poi, davvero non vuoi usare Javascript ...).

    
risposta data 06.09.2012 - 00:12
fonte
2

Prima di tutto sembra che tu abbia bisogno di formulare una strategia di cracking, e per farlo dovresti esaminare quali strumenti stanno usando gli hacker. Ecco un bel post sul blog di qualcuno chi ha rotto 122 milioni di hash . Inoltre, si collega a un ampio elenco di hash di password reali che è possibile utilizzare per la tesi. Penso che tutti questi hash non siano salati, quindi questo semplifica le cose.

RainbowCrack e JohnTheRipper sono strumenti che esistono da molto tempo e sono strumenti popolari per rompere gli hash. Ma quello che stai facendo è molto diverso, è più simile a un cloud in quanto sta suddividendo un grosso compito che deve essere completato da un gran numero di nodi. Esistono strumenti di cloud cracking come Cryptohaze che sembrano promettenti.

    
risposta data 05.09.2012 - 19:04
fonte

Leggi altre domande sui tag