[BSI] Kodowanie, hashowanie, szyfrowanie: Hashowanie
Część druga z czterech:
- Kodowanie.
- Hashowanie.
- Szyfrowanie.
- Przykłady zastosowań. Analiza istniejących rozwiązań.
2. Hashowanie (zwane też 'funkcja skrótu') - jest to przekształcanie ciągu bajtów w inny ciąg bajtów który NIE ZAWIERA żadnych informacji o źródle. Ze względu na praktyczne zastosowanie takich przekształceń, celem algorytmów hashujących jest przekształcenie dowolnej długość ciągu bajtów w ciąg o określonej długość (nie ważne czy będzie to hasło '123' czy plik o wielkości 20 GB, funkcja skrótu zawsze zwróci ciąg o takiej samej długości). Najważniejszymi cechami są:
- wygenerowany ciąg nie może zawierać informacji o ciągu źródłowym (wiąże się to z 'jednokierunkowością' takich funkcji)
- wygenerowany ciąg musi być maksymalnie losowy względem ciągu wejściowego (np. '1' -> 'c4ca4238a0b923820dcc509a6f75849b', '2' -> 'c81e728d9d4c2f636f067f89cc14862c' = mała zmiana na wejściu daje duże i nie przewidywalne zmiany na wyjściu)
- dla tych samych danych źródłowych zawsze musi generować taki sam 'hash'
Wymyślaniem takich super algorytmów zajmują się różni geniusze, a cechą takich algorytmów jest to, że, aby 'złamać' (dowiedzieć się z jakiego ciągu znaków został wygenerowany) hash trzeba wpisywać po koleji ('1', '2', '3', ... ,'asdasdsad') ciągi znaków i generować ich hashe do czasu, aż się trafi taki sam hash jaki chcemy złamać. Dla starych i prostych algorytmów (32-40 znaków 'hasha') hashujących trwa to kilka dni na super komputerze. Dla nowoczesnych algorytmów generujących hashe (o długości 60-160 znaków) są to już lata lub tysiące lat generowania przy obecnych możliwościach komputerów.
Algorytmy hashujące stosowane w przeszłości:
- MD5 - długość hasha: 32 znaki w kodowaniu szesnastkowym - kiedyś bardzo popularny, ale aktualnie tak słaby, że można znaleźć/kupić w internecie bazę danych z wszystkimi możliwymi kombinacjami 32 znaków
- SHA1 - długość hasha: 40 znaków w kodowaniu szesnastkowym - zastąpił MD5, ale aktualnie jest również uznawany za słaby i w internecie są dostępne wielkie bazy wygenerowanych hashy
Używanie MD5 i SHA1 jest bezpiecznie jeśli używa się ich do weryfikacji zawartości plików lub przechowywania haseł wykorzystując 'sól', więcej o soli w hasłach w części czwartej artykułu 'Zastosowania'. Nie należy ich używać do przechowywania haseł 'wprost' ze względu na możliwość odczytania haseł.
Algorytmy hashujące stosowane aktualnie:
- SHA-2 - obsługuje różne długości generowanych hashy, popularne to 'SHA-256' i 'SHA-512' które mają długość hasha w kodowaniu szesnastkowym odpowiednio 64 i 128 znaków - dostępny w większości języków programowania
- SHA-3 - rozwiązanie przyszłościowe (zatwierdzone w 2012), wymaga instalowania dodatkowych bibliotek
Możliwe zastosowania:
- przechowywanie haseł w bazie danych w formie zahashowanej nie pozwala nikomu (włącznie z administratorem) przeglądać haseł, jak się logować kiedy hasło w bazie jest zahashowane opiszę w części czwartej
- sprawdzanie czy plik nie został zmodyfikowany - do dużych plików udostępnianych w internecie często są dołączane pliki .md5 lub .sha1 które zawierają hash danego pliku, korzystając ze specjalnych programów można szybko sprawdzić czy hash danego algorytmu wygenerowany z naszego pobranego pliku i ten który ktoś chciał nam wysłać są identyczne, zapobiega to problemom z błędami pojedyńczych bitów podczas transmisji w internecie, a także potencjalnym próbą przesłania nam zmodyfikowanego pliku przez hackera
Więcej informacji: http://pl.wikipedia.org/wiki/Funkcja_skr%C3%B3tu
Przykład algorytmu hashującego:
Zamień każdą literę w ciągu na wartość jej kodu w kodowaniu ANSI, np. dla hasła '123' (daje to odpowiednio kody 51, 52, 53), teraz pomnóż przez siebie te liczby, da to wynik 140556, tak właśnie powstał 'hash' hasła '123'. Z wyniku '140556' nie da się jednoznacznie ustalić z jakiego ciągu powstał (wykorzystałem funkcję/algorytm jednokierunkową/y), ale jego rozkład losowy jest bardzo słaby (taki sam hash daje np. '132', '321', '231' ..). Tworzenie takiego hashowania jest przykładem 'złych praktyk' w dziedzinie kryptografii - tworzenia własnych algorytmów zakładając, że skoro znam je tylko ja to ciężko będzie je złamać. Lepiej zostawić to 'geniuszom'.