[BSI] Kodowanie, hashowanie, szyfrowanie: Hashowanie

Część druga z czterech:

  1. Kodowanie.
  2. Hashowanie.
  3. Szyfrowanie.
  4. 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'.