Moje zdjęcie
Uczeń LO im. Ma­­ła­chow­skie­go w Płoc­ku. Lubi czy­tać książ­ki. Ma du­żo po­my­słów, jed­nak za­zwy­czaj ma­ło chę­ci lub nie­do­bór umie­jęt­no­ści na ich re­ali­za­cję. In­te­re­su­je się pro­gra­mo­wa­niem. Bie­rze udział w kon­kur­sie po to aby na­uczyć się cze­goś no­we­go. Ocze­ku­je na kon­struk­tyw­ną kry­ty­kę.

niedziela, 19 września 2010

106: Krótko o MD5

C++ nie posiada wbudowanej obsługi sum kontrolnych. Próba samodzielnej implementacji na podstawie danych znalezionych w internecie któregokolwiek z obsługujących je algorytmów skończyła się zmianą mózgu w jajecznicę już na etapie wybierania odpowiedniego rodzaju skrótu. Początkowo chciałem użyć SHA1, który generuje krótkie sumy (40 bajtów) i czytałem kiedyś, że jest fizycznie niemożliwe jego złamanie. Dzisiaj okazało się, że nikt już go nie używa, bo nie jest bezpieczny. Co w związku z tym zrobiłem? Postawiłem na MD5. Dlaczego?

To dość proste. Algorytm zabezpieczający, który chcę zastosować zakłada, że hasło potrzebne do otworzenia pliku z danymi nie będzie przechowywane w żadnej postaci - nawet skrótu. Nie ma zatem obawy, że suma MD5 zostanie wydobyta (projekt jest open source, więc wydedukowanie które znaki są sumą to nie problem), a kolizja znaleziona.

Tutaj rodzi się kolejne pytanie: po co więc potrzebne jest mi MD5? To proste: hasło nie będzie przechowywane, za to będzie ziarnem do generowania kodu szyfrującego. Potrzebny jest jednak sposób na sprawdzenie czy hasło jest poprawne, żeby program nie wczytał krzaków i sam się nie wykrzaczył. W tym celu zostanie wylosowane 512 bajtów, obliczona zostanie ich suma kontrolna, a potem zostaną zapisane w postaci zaszyfrowanej zapisane na początku pliku wraz ze skrótem. Sprawdzanie poprawności hasła sprowadzi się więc do wygenerowania klucza z podanego ciągu, odszyfrowania pierwszych 512 bajtów pliku z danymi, obliczenie ich sumy kontrolnej i porównanie z tą zapisaną. Jeżeli się zgadza - hasło jest najprawdopodobniej poprawne, w przeciwnym wypadku - na pewno jest błędne.

Jak widać samo znalezienie kolizji sumy nie wystarczy do złamania kodu, zatem bezpieczeństwo algorytmu skrótu nie jest istotne. Stąd wybór padł na MD5, ponieważ generuje krótki skrót i jest popularne - dzięki temu łatwo będzie znaleźć gotową implementację.

Mimo to zajęło mi chwilkę wyszukanie czegoś prostego, bez sterty zbędnych dodatkowych algorytmów czy skomplikowanej obsługi. W końcu jednak moim oczom ukazała się świetna implementacja, która hashuje poprzez wywołanie jednej funkcji i zawiera się tylko w dwóch plikach. A znalazłem ją tutaj. Proste, łatwe, przyjemne.

2 komentarze:

  1. MD5 również nie jest bezpieczny. Udowodniono kolizję

    OdpowiedzUsuń
  2. Ale w tym wypadku znalezienie kolizji i tak nic nie da, a znalezienie gotowej implementacji MD5 było łatwiejsze. A skoro SHA1 jest już tak samo łamliwe jak MD5, to po co się męczyć?

    OdpowiedzUsuń