Funkcje hashujące i ich zastosowanie#
Autor: Maciej Grześkowiak
Format danych#
Dane na urządzeniach elektronicznych są reprezentowane za pomocą ciągów zbudowanych z dwóch znaków 0 oraz 1. Np.:
Jednak dla użytkownika laptopa czy telefonu praca z ciągami bitów jest niewygodna. Z tego powodu krótkie bloki bitów oznacza się literkami lub cyframi, aby były zrozumiałe dla przciętnego użytkownika laptopa.
Takie bloki często nazywamy kodami. Np.:
Kod Heksadecymalny jest przykładem kodu bloków 4 bitowych, np.: 1010, to a,
Kod Base64 jest przykładem kodu bloków 6 bitowych, np.: 011011 to a,
Kod ASCII jest przykładem kodu bloków 8 bitowych, np.: 0100 0001, to a.
Zadanie
Wejdź na stronę https://gchq.github.io/CyberChef/
W polu Input dowolne zdanie. W sekcji Operations wyszukaj Data format
Wyszukaj To Binary i przciagnij do sekcji Recipe. W polu Output zobaczysz reprezentacje binarną 8 bitowych kodów ASCII.
Wyszukaj To Hex przciagnij do sekcji Recipe. W polu Output zobaczysz reprezentacje binarna 4 bitowych kodów Heksadecymalnych. Każda cyfra lub literka odpowiada 4 bitom.
Wyszukaj To Base64 przciagnij do sekcji Recipe. W polu Output zobaczysz reprezentacje binarna 6 bitowych kodów Base64. Każda cyfra, literka lub znak z klawiatury odpowiada 6 bitom.
Wniosek: Zamiana kodu na bity i odwrotnie jest łatwa - nawet dla człowieka!!!!
Funkcja hashująca i hashowanie#
Funkcja hashująca jest kryptograficznym algorytmem, do którego wejściem jest dowolny ciąg bitów, a wyjściem ciąg bitów o ustalonej długości. Oznaczmy przez H funkcję hashującą.
Wtedy, dla wejść «cześć», «hello», «Ala tańczy walca» obliczamy wartości funkcji hashującej H.
H(cześć) = 21c5b9c63518dda9846600f0c8ea4751f43488f2
H(hello) = aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
H(Ala tańczy walca) = 41d2b428b9cee2028bf5f46eeb1f6af419668857
Liczba bitów wyjścia tej funkcji jest równa 160 bitom. Te 160 bitów jest zakodowanych heksadecymalnie, dlatego mamy po 40 literek i cyferek na wyjściu.
Hashowanie to proces obliczania wartoścji funkcji hashujące, której argumentami jest dowolny ciąg bitów. Zapamietaj HASH, to wartość funkcji hashującej.
Zadanie Obliczanie hashy
Wejdź na stronę https://gchq.github.io/CyberChef/
W polu Operations wpisz SHA1
Przeciągnij pole SHA1 do sekcji Recipe
Wpisz tekst do hashowania do sekcji Input
W panelu Output na dole pojawi się hash tekstu z pola Input.
Zadanie: Przetestuj funkcje hashujące SHA3 i oblicz jej hashe. Ile bitów ma hash tej funkcji?
Zadanie Obliczanie hasha funkcji SHA3 pliku
Zapisz zdjęcie kotka na pulpicie.
Wejdź na stronę https://gchq.github.io/CyberChef/
W polu Operations wpisz SHA3 i przeciągnij pole SHA3 do sekcji Recipe
W polu Input wybierz Open file as input i wczytaj plik. Alternatywnie przeciagnij plik z kotkie z pulpitu do sekcji Input.
Cechy bezpiecznej funkcji hashującej#
Bezpieczna funkcja hashująca powinna posiadac dwie cechy:
Pierwszą własność jest taka, że na podstawie wyjścia, czyli hasha, trudno jest obliczyć wejście do tej funkcji!!! Mówimy wtedy, że funkcja hashująca jest jednokierunkowa.
Np.: To jest hash mojego hasła 0388488446f3584b20b5401731c5bd9b705a5304308be18405eacf56c19dfc0a. Znajdź to hasło!!! To musi byc trudne dla ciebie i komputera.
Drugą cecha bezpiecznej funkcji hashującej jest taka, że trudno jest znaleźć dwa różne wejścia do funkcji, aby ich hash był sobie równy, nawet dla komputera. Mówimy wtedy, że funkcja hashująca jest bezkonfliktowa.
Zadanie Porównaj hasha SHA1 dwóch poniższych plików
Zapisz plik shattered-1.pdf oraz shattered-2.pdf na pulpicie.
Wejdź na stronę https://gchq.github.io/CyberChef/
W polu Operations wpisz SHA1 i przeciągnij pole SHA1 do sekcji Recipe, tak jak to robiliśmy wcześniej
W polu Input wybierz Open file as input i wczytaj plik shattered-1.pdf z pulitu. Alternatywnie przeciagnij plik z z pulpitu do sekcji Input.
W polu Input wybierz Open file as input i wczytaj plik shattered-2.pdf z pulitu. Alternatywnie przeciagnij plik z z pulpitu do sekcji Input.
Funkcje hashujące, które są jednokierunkowe i bezkonfliktowe wykorzystujemy do ochrony haseł!!!!!
Ochrona haseł: hash#
Załóżmy, że Alice chce się zarejestrować do jakiegoś servisu internetowego. W tym celu podczas rejestracji serwis zapyta ją o jej identyfikator, najczęściej jest to e-mail lub numer telefonu. Następnie, Alice zastanie poproszona o wymyślenie hasła dostępu do tego serwisu. Alice może otrzymać mejla, którego celem jest weryfikacja jej adresu i potwierdzenie chęci założenia konta w serwisie. W ten sposób nastapiła rejestracja Alice. Nastepnie, Alice loguje się za pomocą swojego indentyfikatora i hasła do serwisu.
Zatem, aby się zarejestrowac do serwisu musi zostać wykonany protokół składający się z dwóch głównych kroków:
(setup) Alice wybiera identyfikator i hasło i przekazuje do usługi, a serwis oblicza przechowuje w swojej bazie identyfikator Alice oraz hash jej hasła.
(uwierzytelnienie) Alice loguje się do serwisu podająć swój identyfikator oraz hasło, a serwis oblicza hash hasła i porównuje z tym jest identyczy z hashem przechowywanym w jego bazie.
Wniosek: Hasła nie są przechowywane, przechowywane są tylko ich hashe!!!!
Tak może wyglądać baza sewisu internetowego, która przehowuje identyfikatory oraz hashe haseł użytkowników.
Jak odgadnąć hasło?#
Najprostszym sposobem zalogowania się na cudze konto jest próba odgadnięcia jego hasła. Można próbować wpisywać jakieś hasła i liczyć na szczęście - a nuż się uda. Taki scenariusz najczęściej spotykamy filmach sensacyjnych. Czasami się zdarza, że hakerzy wykradają bazę serwisu z identyfikatorami i hashami użytkowników. Wtedy, można odgadnąć hasło jeśli są ono słabe, albo inaczej jest podatne na ataki słownikowe (dictionary attacks).
Atak słownikowy#
Atak słownikowy wykorzystuje tzw. słowniki tzn. plik zawierający słowa, frazy, popularne zwroty i inne ciągi, które prawdopodobnie mogły być użyte jako hasło. Każde słowo w słowniku jest hashowane, a jego hash jest porównywany z hashami z bazy serwisu (z tymi zdobytymi przez hakera). Jeśli oba hashe są identyczne, to słowo jest hashem osoby o odpowiadającym hashowi identyfikatorze.
Zadanie
Haker dostarczył Ci identifikator oraz odpowiadający hash wykonany funkcją SHA1.
id |
hash |
---|---|
f8e6dc24e209a5cd33a26979c397b0f8f34bd372 |
Sprawdź czy hasło, które ma powyższy hash znajduje się w słowniku:
słownik |
---|
password |
mojkotek |
Frania1 |
Jan2000 |
qwerty |
KucykPony |
iloveyou |
admin |
welcome |
123456 |
Wykorzystaj narzędzie CyberChef.
Wejdź na stronę https://gchq.github.io/CyberChef/
Skopiuj słownik do sekcji Input
W polu Operations wyszukaj Fork i przeciągnij do sekcji Recipe
W polu Operations wyszukaj SHA1 i przeciągnij do sekcji Recipe
W sekcji Output znajdź hash związany z kontem o identyfikatorze elon@x.com
W sekcji Input odszukaj hasła, które odpowiada znalezionemu hashowi.
Zadanie
Haker dostarczył Ci identifikator oraz odpowiadający mu hash.
id |
hash |
---|---|
2c08e8f5884750a7b99f6f2f342fc638db25ff31 |
Odgadnij hasło oraz odszukaj informację, którą funkcją hashująca wykonano powyższy hash. Wykorzystaj aplikację online https://crackstation.net/
Wejdź na stronę https://crackstation.net/ i złam hasło Bezosa:
Ochrona haseł: hash i sól#
Jak się przekonaliśmy, jeśli hasło znajduje się w słowniku, to jego odgadnięcia na podstawie hasha nie jest trudne. Własciwie wymaga to trochę pracy komputera, a więć i czasu. To wszytko pociąga za sobą zużycie energii.
Obliczenia można łatwo przyspieszyć budując takie słowniki jak poniżej. Wtedy nie trzeba obliczac hashy i wystarczy tylko wyszukać o dczytać hasło.
hash |
hasło |
---|---|
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8 |
password |
0fd0ce609e709bef004cbee1ffe497451a228de7 |
mojkotek |
aeac88150dbb162a0060355443d57170d3494e24 |
Frania1 |
6d829a594d42101737b910744ecd766463ac4b17 |
Jan2000 |
b1b3773a05c0ed0176787a4f1574ff0075f7521e |
qwerty |
f8e6dc24e209a5cd33a26979c397b0f8f34bd372 |
KucykPony |
ee8d8728f435fd550f83852aabab5234ce1da528 |
iloveyou |
d033e22ae348aeb5660fc2140aec35850c4da997 |
admin |
c0b137fe2d792459f26ff763cce44574a5b5ab03 |
welcome |
7c4a8d09ca3762af61e59520943dc26494f8941b |
123456 |
Żeby utrudnić powyższy atak, hasła łaczy się z losowym ciągiem zwanym solą, a następnie całość się hashuje. W tym scenariuszu, aby się zarejestrować do serwisu musi zostać wykonany protokół składający się z dwóch głównych kroków:
(setup) Alice wybiera identyfikator i hasło i przekazuje do usługi, a serwis losuje sól, hashuje sól i hasło. Przechowuje w swojej bazie identyfikator Alice, sól i hash jej hasła i soli.
(uwierzytelnienie) Alice loguje się do serwisu podająć swój identyfikator oraz hasło, a serwis oblicza hash soli i hasła, które odpowiadają identyfikatorowi. Następnie, serwis porównuje obliczony hash z tym przechowywanym w jego bazie.
Tak może wyglądać baza sewisu internetowego, która przehowuje identyfikatory oraz hashe haseł użytkowników.
Tęczowe tablice#
Opiszemy teraz technikę odgadywania haseł na podstawie zdobytego hasha, która wykorzystuje tzw. tęczowe tablice. Oto przykład uproszczonej tęczowej tablicy:
start |
end |
---|---|
Reksio |
fea8be |
Lolek |
95eabf |
Puchatek |
bf3b8a |
W jaki sposób postało fea8be? Dane jest hało poczatkowe Reksio. Z wartości funkcji SHA1(Reksio) bierzemy pierwszych 6 znaków 89c45d (zobacz tabelka poniżej). W ten sposób dostajemy kolejne hasło. Podobnie, z wartości SHA1(2fb4b3) bierzemy pierwszych 6 znaków 2fb4b3 i obliczamy SHA1(2fb4b3), z czego bierzemy pierwszych 6 znaków. W ten sposób dostajemy wartośc końcową fea8be. Z tabelki poniżej odczytujemy 3 hasła i odpowiadające in hashe.
hasło |
SHA1(hasło) |
---|---|
Reksio |
89c45d48735752deffb9e9fc842be9f94a7945b5 |
89c45d |
2fb4b313835b9b17a8ca9fd7011bbb70fe75e875 |
2fb4b3 |
fea8bede9d16313514dd1a1bd521f2e0cec8c9a4 |
fea8be |
Zadanie
Haker dostarczył Ci identifikator oraz odpowiadający mu hash funkcją SHA1
id |
hash |
---|---|
bf3b8a952a572c9bb875e4021ba946ac08b9b908 |
Wykorzystaj narzędzie CyberChef oraz tęczową tablice
start |
end |
---|---|
Reksio |
fea8be |
Lolek |
95eabf |
Puchatek |
bf3b8a |
i znajdź odpowiadające hasło.
Wejdź na stronę https://gchq.github.io/CyberChef/
W polu Operations wyszukaj SHA1 i przeciągnij do sekcji Recipe, a w polu Input wpisz Puchatek
W polu Operations wyszukaj Take Bites, przeciągnij do sekcji Recipe i ustaw length na 6.
Sprawdź, czy znaki z sekcji Output są równe pierwszym 6 znakom hasha, który dostarczył ci haker. Jeśli tak, sprawdź czy hash obliczony jest równy hashowi od hackera. Jeśli nie, to znaki z sekcji Output przenieś do sekcji Input. Możesz to zrobić za pomocą strzałki.
Powtórz działania z kroku 4.
Uwaga: Jak widać z powyższych ćwiczeń sól znacznie utrudnia przedstawione powyżej idee ataków.
Protokół dostępu do usługi za pomocą hasła, soli i pieprzu#
W celu zwiększenia złożoności obliczeniowej ataku słownikowego poza hasłem i solą można dodać do hasła losowy element zwany tajną solą lub pieprzem. Pieprz ma 12 bitów.
W tym scenariuszu, aby się zarejestrowac do serwisu musi zostać wykonany protokół składający się z dwóch głównych kroków:
(setup) Alice wybiera identyfikator i hasło i przekazuje do usługi, a serwis losuje sól oraz pieprz i hashuje sól, pieprz i hasło. Przechowuje w swojej bazie identyfikator Alice, sól i hash jej hasła i soli.
(uwierzytelnienie) Alice loguje się do serwisu podająć swój identyfikator oraz hasło. Serwis pobiera hasło i sól, które odpowiada identyfikatorowi Alice z bazy. Następnie, serwis oblicza wszystkie możliwe hashe, które postają na podstawie hasła, soli i 12 bitowego ciągu. Jeśli któryś z obliczonych hashy jest równy hashowi przechowywanemu w bazie, to Alice zostaje uwierzytelniona.
Tak może wyglądać baza sewisu internetowego, która przehowuje identyfikatory oraz hashe haseł użytkowników.