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.
MD5 również nie jest bezpieczny. Udowodniono kolizję
OdpowiedzUsuń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ń