MD5 Double Hash crack

19 Giugno 2008

Recentemente mi sono accorto che alcuni servizi di hosting conservano nel database le passwords degli accounts in doppia hash md5.
Per doppia hash intendo

MD5(MD5(password)).

Un tentativo di forzare una password in questo stato facendo uso dei servizi online come Md5Crack o come Gdata,sarebbe totalmente inutile.
Il sistema che ho implementato è banale,prevede la ricerca della password a partire da una hash doppia,facendo uso di un dizionario: di ogni voce del dizionario viene calcolata la hash doppia e viene confrontata con l’input,se vi è un match il programma si arresta e fornisce la voce ottenuta.
Sicuramente una ricerca lineare non è il massimo,l’ideale è implementare un database distribuito come il celebre rainbow tables,ma per le hashes doppie attualmente non sembra esserci altro.
Facendo uso di un buon dizionario di passwords,come questo,il programmino impiega un tempo nell’ordine di 30 secondi per scorrere un tale dizionario,e parliamo di circa 40MB.
Nel codice faccio uso di una funzione molto importante per la gestione dei files da applicativi in C :
la funzione mmap,tale funzione consente di mappare un file sullo spazio di indirizzamento virtuale del processo,in pratica vi muoverete sul file come su un vettore void* ,fate il cast a char*e avrete una vera e propria stringa:potete dimenticarvi quindi delle odiose fseek,fwrite etc…
La funzione MD5,presa dalla libreria libssl, con header in

openssl/md5.h

ha 3 argomenti:stringa da criptare,dimensione in bytes della stringa da criptare,stringa su cui riporre l’hash.
Leggi il seguito di questo post »


Canto Notturno di pastore errante dell’Asia

18 Giugno 2008

Da tempo volevo condividere i pensieri e le emozioni che questa lirica di Leopardi mi ha dato con chiunque passasse da questo blog.
E’ una delle mie preferite in assoluto,concentra nei suoi versi la forza e la disperazione dell’uomo,che nel suo breve viaggio trova il coraggio di porsi La Domanda Essenziale:il significato della sua esistenza.
L’uomo è eroico,perchè continua a vivere nel tedio,pur sapendo che non troverà mai risposta alle sue domande,continua a camminare e non si arrende,come il pastore dell’Asia che per una vita intera sopporta le asperità del terreno che calpesta,fin quando non giunge alla fine dei suoi giorni.


Che fai tu, luna, in ciel? dimmi, che fai,
silenziosa luna?
Sorgi la sera, e vai,
contemplando i deserti; indi ti posi.
Ancor non sei tu paga
di riandare i sempiterni calli?
Ancor non prendi a schivo, ancor sei vaga
di mirar queste valli?
Somiglia alla tua vita
la vita del pastore.
Leggi il seguito di questo post »


Librerie grafiche SWT : operare sui widgets da Threads secondari

3 Giugno 2008

Recentemente sto lavorando ad un rcp, mi è capitato quindi di dover apportare delle modifiche in runtime sullo stato dei widgets grafici del mio prodotto.
Spesso può succedere che deleghiamo ad un thread secondario delle operazioni che richiedono un particolare tempo d’attesa,nel mio caso ad esempio il thread resta in ascolto su uno stream di un processo in esecuzione.
Avendo ricevuto un segnale,il thread ad esempio potrebbe avere la necessità di apportare una modifica ad un widgets,sempre nel mio caso una volta ricevuta una stringa dallo stream il thread vuole stamparla su un TextViewer e ritornare in ascolto per una nuova stringa.
In questo contesto è bene tenere presente però, che il thread secondario non ha un privilegio d’accesso tale da poter apportare direttamente modifiche sul display,ed è anche ragionevole tale comportamento perchè gli eventi grafici devono essere schedulati secondo un ordine ben preciso da un apposito thread,non vengono elaborati per come arrivano,a casaccio.

Le SWT ci offrono due strumenti utile per poter effettuare queste operazioni in modo pulito: i metodi
asyncExec(Runnable) e syncExec(Runnable).
I due metodi hanno come argomento un oggetto di tipo runnable,possiamo istanziarvi una classe che implementa il metodo run() con le operazioni grafiche che ci interessano.
es.

 display.asyncExec(new Runnable() {
					public void run() {
			if(StatusLineContribution.isBuildEnabled())
				StatusLineContribution.setBuildEnabled(false);
				StreamView.resetStreamViewer(textDoc,streamViewer);
					}
			  });

Leggi il seguito di questo post »