|
Naszła mnie jakiś czas temu ochota na przygotowanie systemu do łamania haseł MD5. Metoda jest bardzo prosta. Bierzmy słownik, obliczamy skróty MD5 wszystkich słów w słowniku a następnie wyszukujemy odpowiedniego wpisu. Długo nie mogłem znaleźć odpowiedniego słownika w sieci aż w końcu wpadłem na pomysł wykorzystania słownika ortograficznego dostępnego w Open Office. Wersja tego słownika zawiera około 280 tyś haseł.
A więc odnajdujemy plik pl_PL.dic słownika (siedzi gdzieś w katalogu z OO). Jest to plik tekstowy gdzie każde słowo umieszczone jest w nowej linii. Zabawę psuje nam fakt, że nie które linie zawierają inne informacje po znaku /. A by je usunąć można wykorzystać awk:
{ split ($0,tab,"/") print tab[1] }
wywołując go tak: awk -f go.awk pl_PL.dic >> clear_dic Rozwiązanie to ma wadę. Dla linii bez znaku / zwraca napis ze znakami końca wiersza ale gdy awk wytnie nam pierwsze bajty do / to otrzymamy napis bez tych znaków. Nie bardzo wiedziałem jak to naprawić więc przerzuciłem się na prosty program w C.
#include <stdio.h> #include <stdlib.h> #define LINE_SIZE 200 int main() {
char line[LINE_SIZE];
FILE *fp = fopen("pl_PL.dic","r");
if(!fp)
{
perror("Nie moge otworzyc pliku");
return 1;
}
FILE *out = fopen("clear_dic","w");
while(fgets(line,LINE_SIZE,fp)!=NULL) {
int firstword=strcspn(line,"/");
char ff[LINE_SIZE];
if(firstword==strlen(line))
{
strncpy(ff,line,firstword);
ff[firstword-2]='\n';
ff[firstword-1]='\0';
strcpy(line,ff);
}
else
{
strncpy(ff,line,firstword);
ff[firstword]='\n';
ff[firstword+1]='\0';
strcpy(line,ff);
}
printf(line);
fprintf(out,"%s",line);
}
close(out);
close(fp);
}
Mając już plik bez śmieci możemy wygenerować zapytania do bazy danych. Ja użyłem PostgreSQL. Skrypt w bash ma postać:
rm out for line in `cat clear_dic`; do result=$(echo -n $line |/usr/bin/md5sum); md5=$(echo $result | cut -d ' ' -f 1); echo $line; echo "INSERT INTO data VALUES ('$line','$md5');" >> out; done Tabela może wyglądać tak: CREATE TABLE data ( word text, md5 text );
Teraz mamy już gotowy plik z 280 tyś zapytaniami do bazy. Dodawanie rekordów trwało około 10 minut. Generacja zapytań w bashu około 3 godzin. Czyszczenie pliku z śmieci kilka sekund (Celeron M 1,4). Odpalamy jakiś program wspomagajacy dostep do bazy i możemy pytać: SELECT word FROM data WHERE md5=tu_wpisujemy_skrót po 300ms otrzymujemy odpowiedz :) Metoda może nie zbyt skuteczna na 40 użytkowników złamałem 5 haseł - satysfakcja gwarantowana. W sieci znajdziecie podobne „lepsze” metody łamania MD5 z wykorzystaniem tęczowych tablic. |