Jej nazwa składa się pochodzi od greckich słów κρυπτός oraz γράφω gráfo oznaczających „pisać”. Jest to nauka o utajnianiu wiadomości. Kryptografia wykorzystywana jest od tysięcy lat. Poczynając od szyfru przesuwającego, z pomocą którego Juliusz Cezar utajniał swoją prywatną korespondencję, poprzez Enigmę służącą Niemieckiej armii, aż do dzisiaj, kiedy to odgrywa wielką rolę w globalnej komunikacji. To dzięki niej możemy się czuć jakkolwiek bezpieczni w cyfrowym świecie.
Logując się każdego dnia na różne portale w Internecie raczej nie myślimy o tym w jaki sposób firmy przechowują nasze hasła. Jest to jednak kluczowa rzecz w kwestii naszego bezpieczeństwa, dlatego warto ją omówić.
Metod przechowywania jest kilka, oto te, z którymi możesz się kiedykolwiek spotkać:
Każdą z tych możliwości poniżej pokrótce omówię.
Metoda 1 – czysty tekst
Jest to najniebezpieczniejsza ze wszystkich metod, ponieważ hasła przechowywane są „gołe”. pozyskania wystarczy uzyskać dostęp do bazy danych. Kiedy haker przejmie bazę będzie miał do dyspozycji dane wszystkich użytkowników.
Niestety korzystają z niej nawet „więksi gracze”. Adobe, Imgur, VK i wiele innych portali przechowywało hasła jako czysty tekst. Nie wierzysz? Sprawdź listę wycieków na Have I Been Pwned?, i przy okazji również bezpieczeństwo swoich kont.
Metoda 2 – szyfrowanie symetryczne (tutaj: Blowfish)
Kolejnym sposobem jest szyfrowanie symetryczne. Polega ono na utajnieniu pewnej wiadomości za pomocą jednego klucza, którego można również wykorzystać do jej odszyfrowania. Oznacza to, że jest to metoda dwukierunkowa.
Jest to pozornie bezpieczne rozwiązanie, ponieważ rzeczywiście hasła nie są widoczne ,,na pierwszy rzut oka”, ale wystarczy, że atakujący pozyska klucz szyfrujący ażeby mógł otrzymać dostęp do czystych danych.
Obecnie jest to metoda stosowana bardzo rzadko oraz raczej do ochrony informacji pokroju danych osobowych, historii chorób i temu podobnych. Wynika to z jej nikłego bezpieczeństwa, którego poziom właściwie nie różni się od przechowywania haseł w czystym tekście.
Metoda 3 – funkcje hashujące (tutaj: MD5)
Ta metoda polega na przechowywaniu w bazie wartości bezpiecznej funkcji hashującej (funkcji skrótu kryptograficznego), której podajemy hasło wpisane przez użytkownika.
Dla osób niezaznajomionych z tym pojęciem zapewne brzmi ono bardzo strasznie, ale za chwilę udowodnię, że oznacza coś bardzo prostego do rozumienia.
Funkcje hashujące (mieszające) mają kilka kluczowych właściwości. Jest to przede wszystkim:
Jednokierunkowość – na podstawie wyjścia funkcji nie możemy określić jak ono pierwotnie brzmiało. Pozwala to na stworzenie systemu, który umożliwia logowanie się użytkowników bez przechowywania ich właściwych haseł.
// We wszystkich następnych przykładach będę stosował pseudokod
hash('lambda') => "945F3FC449518A73B9F5F32868DB466C"
// Tego hasha nie da się bezpośrednio odwrócić
Szybkość – funkcje mieszające są zoptymalizowane pod kątem szybkości tworzenia skrótów (hashy). Dzięki temu logowanie trwa krótko, ale otwiera to furtkę do ataków brute-force. Poprzez wyliczenie każdego możliwego do uzyskania wyniku możemy złamać pierwszą właściwość tej funkcji i „odwrócić” uzyskane hashe.
hash('aaa') => "47BCE5C74F589F4867DBD57E9CA9F808"
hash('aab') => "E62595EE98B585153DAC87CE1AB69C3C"
hash('aac') => "A9CED3DAD556814ED46042DE696E1849"
...
Z każdym kolejnym rokiem bezpieczeństwo funkcji mieszających maleje z wyniku wzrostu mocy obliczeniowej procesorów. Karta graficzna GeForce GTX 970 potrafi wygenerować prawie 300 milionów skrótów SHA3 na sekundę. Aby ten czas ograniczyć można skorzystać z tzw. tęczowych tablic, które zawierają w sobie miliony wygenerowanych już hashy.
Kolejnym problemem funkcji hashujących mogą być ich jednakowe wyniki. Kiedy tworzymy hash, funkcja mieszająca zawsze poda ten sam wynik. Pozwala to na np. odkrycie haseł dwóch użytkowników jednocześnie, co przyspiesza ten proces. Tutaj na pomoc przychodzą sole, czyli losowe fragmenty tekstu dołączane do treści, której hash chcemy pozyskać.
hash('qwerty') => "D8578EDF8458CE06FBC5BB76A58C5CA4"
hash('qwerty') => "D8578EDF8458CE06FBC5BB76A58C5CA4"
hash('qwerty' + _'c2eMEd'_) => "5701404BA6AFFC7F08780E3BB8E4F488"
hash('qwerty' + _'6yK7ED'_) => "0AAF55F84A2F98322CED23B2E986DE34"
// hash( hasło + sól ) => hash
Użycie soli zapobiega problemowi, którego opisałem powyżej, i tym zwiększa ilość czasu potrzebną do wykonania ataku brute-force, ale go w dużej mierze nie eliminuje.
I tu wchodzi bcrypt, cały na biało – bardzo bezpieczna funkcja mieszająca o obecnie coraz większej popularności. Wyróżnia ją to, że została stworzona specjalnie z myślą hashowania haseł statycznych, a nie dowolnych danych binarnych.
Funkcje bcrypt przyjmują trzy wartości:
Trzecia wartość najbardziej wyróżnia ten sposób ukrywania treści. Oznacza ona ilość wykonań pętli algorytmu szyfrującego, zatem można ją skojarzyć ze stopniem złożoności obliczeniowej.
Każde zwiększenie złożoności o jeden oznacza dwukrotnie dłuższy czas obliczeń hasha. Jeśli hashe z kosztem = 11 obliczane są w ciągu 0.25 sekundy, to hashe z kosztem = 14 będą obliczane w 2 sekundy. Różnica dla użytkownika będzie praktycznie niezauważalna – jednak w momencie kradzieży bazy danych, agresor w ciągu sekundy będzie mógł sprawdzić co najwyżej kilkaset hashy BCrypt, zamiast milionów hashy MD5/SHA1.
Jest to największa zaleta bcrypt i tym samym zupełnie eliminuje możliwość wystąpienia ataku brute-force. Oczywiście do czasu, bo moc obliczeniowa komputerów nieustannie się powiela. MD5 też kiedyś było bezpieczną funkcją, a teraz odradza się korzystanie z niej we wszystkich przypadkach.
Prawdopodobnie nie dane mu było go poznać i zapamiętać 😉
Ale czy w ogóle ma taką możliwość? Zależy.
Zakładając, że nie obowiązują go procedury bezpieczeństwa i ochrona danych użytkowników, to… również zależy.
Po lekturze tego artykułu powinieneś/powinnaś już wiedzieć, które hashe można odwrócić i tym poznać właściwe hasło. Będzie to oczywiście plaintext, hasła szyfrowane symetrycznie (zakładając znajomość klucza) i z dużą pewnością niebezpieczne funkcje mieszające pokroju MD5.
Jak jest w rzeczywistości? Oczywiście najgorzej jak mogłoby być. Pod koniec marca tego roku w mediach technologicznych pojawiła się informacja, że Facebook przyznał się do przechowywania haseł w… czystym tekście.