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.:

\[ 00101010010010010010010101010010010101010. \]

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.:

  1. Kod Heksadecymalny jest przykładem kodu bloków 4 bitowych, np.: 1010, to a,

  2. Kod Base64 jest przykładem kodu bloków 6 bitowych, np.: 011011 to a,

  3. Kod ASCII jest przykładem kodu bloków 8 bitowych, np.: 0100 0001, to a.

Zadanie

  1. Wejdź na stronę https://gchq.github.io/CyberChef/

  2. W polu Input dowolne zdanie. W sekcji Operations wyszukaj Data format

OT

  1. Wyszukaj To Binary i przciagnij do sekcji Recipe. W polu Output zobaczysz reprezentacje binarną 8 bitowych kodów ASCII.

OT

  1. 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.

OT

  1. 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.

OT

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

  1. Wejdź na stronę https://gchq.github.io/CyberChef/

  2. W polu Operations wpisz SHA1

OT

  1. Przeciągnij pole SHA1 do sekcji Recipe

OT

  1. Wpisz tekst do hashowania do sekcji Input

OT

  1. W panelu Output na dole pojawi się hash tekstu z pola Input.

OT

Zadanie: Przetestuj funkcje hashujące SHA3 i oblicz jej hashe. Ile bitów ma hash tej funkcji?

Zadanie Obliczanie hasha funkcji SHA3 pliku

  1. Zapisz zdjęcie kotka na pulpicie.

OT

  1. Wejdź na stronę https://gchq.github.io/CyberChef/

  2. W polu Operations wpisz SHA3 i przeciągnij pole SHA3 do sekcji Recipe

OT

  1. W polu Input wybierz Open file as input i wczytaj plik. Alternatywnie przeciagnij plik z kotkie z pulpitu do sekcji Input.

OT

Cechy bezpiecznej funkcji hashującej#

Bezpieczna funkcja hashująca powinna posiadac dwie cechy:

  1. 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.

  1. 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

  1. Zapisz plik shattered-1.pdf oraz shattered-2.pdf na pulpicie.

  2. Wejdź na stronę https://gchq.github.io/CyberChef/

  3. W polu Operations wpisz SHA1 i przeciągnij pole SHA1 do sekcji Recipe, tak jak to robiliśmy wcześniej

  4. 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.

  5. 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:

  1. (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.

  2. (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.

OT

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

elon@x.com

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.

  1. Wejdź na stronę https://gchq.github.io/CyberChef/

  2. Skopiuj słownik do sekcji Input

OT

  1. W polu Operations wyszukaj Fork i przeciągnij do sekcji Recipe

OT

  1. W polu Operations wyszukaj SHA1 i przeciągnij do sekcji Recipe

OT

  1. W sekcji Output znajdź hash związany z kontem o identyfikatorze elon@x.com

  2. W sekcji Input odszukaj hasła, które odpowiada znalezionemu hashowi.

Zadanie

Haker dostarczył Ci identifikator oraz odpowiadający mu hash.

id

hash

bezos@amazon.com

2c08e8f5884750a7b99f6f2f342fc638db25ff31

Odgadnij hasło oraz odszukaj informację, którą funkcją hashująca wykonano powyższy hash. Wykorzystaj aplikację online https://crackstation.net/

  1. Wejdź na stronę https://crackstation.net/ i złam hasło Bezosa:

OT

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:

  1. (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.

  2. (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.

OT

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

altman@openai.com

bf3b8a952a572c9bb875e4021ba946ac08b9b908

Wykorzystaj narzędzie CyberChef oraz tęczową tablice

start

end

Reksio

fea8be

Lolek

95eabf

Puchatek

bf3b8a

i znajdź odpowiadające hasło.

  1. Wejdź na stronę https://gchq.github.io/CyberChef/

  2. W polu Operations wyszukaj SHA1 i przeciągnij do sekcji Recipe, a w polu Input wpisz Puchatek

OT

  1. W polu Operations wyszukaj Take Bites, przeciągnij do sekcji Recipe i ustaw length na 6.

OT

  1. 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.

OT

  1. Powtórz działania z kroku 4.

OT

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:

  1. (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.

  2. (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.

OT