Hash

V IT priestore sa často stretávame s pojmom „hash“. Čo to je, na čo slúži a aké využitie má vo svete IT, to si povieme v tomto článku. 

Hash je výstupom, čiže výsledkom, hashovacej funkcie. Je to krátky reťazec na prvý pohľad nič nehovoriacich znakov. V podstate teda ide o známe šifrovanie a týmto štýlom sa šifrujú hocijaké citlivé údaje, s ktorými potrebujeme pracovať tak, aby ich nik nepovolaný nedokázal jednoducho prečítať. 

Hlavným znakom hashovania je fakt, že ide o jednosmernú funkciu. Teda musí byť veľmi jednoduché nejaké dáta zahashovať (zašifrovať), ale zároveň ich musí byť veľmi ťažké rozlúštiť. Uvediem príklad. Je veľmi jednoduché vynásobiť dva prvočísla, napr. 41 a 83. Výsledok by bol 3403. Ale je veľmi ťažké z čísla 8051 zistiť, ktoré dva prvočísla boli vynásobené, aby vyšiel takýto výsledok (v tomto prípade som použil 97 a 83).

Samozrejme, v číselnom jazyku to človeku až také zložité nepríde, ale my sa vo svete IT bavíme o hashovaní na úrovni bitov. Z toho dôvodu je možné šifrovať nielen čísla, ale prakticky všetky dáta (obrázky, texty, ba aj zvuk). 

Základné požiadavky

Aby sme hashovanie mohli používať v IT, musíme zabezpečiť, aby hashované stringy (reťazce) spĺňali určité požiadavky

Jednosmernosť: O tom som písal vyššie. Musí byť jednoduché reťazec zašifrovať, ale veľmi zložité ho rozšifrovať.

Nemennosť: Z rovnakého vstupného stringu musí vzniknúť vždy rovnaký hash, inak by nám takéto šifrovanie bolo na nič, ak by zakaždým vznikol iný výsledok.

Lavínovitosť: To v preklade pre našinca znamená, že aj maličká zmena vo vstupnom reťazci vytvorí radikálnu zmenu vo výsledku. 

Kolíznosť: Ak pre dva rozličné vstupy vznikne rovnaký hash, hovoríme, že došlo ku kolízií. Čím nižšia je bezkolíznosť, tým lepšie.

Hashovacie algoritmy

Hashovací algoritmus je algoritmus, na základe ktorého vznikne hash. Väčšinou ide o veľmi zložitú matematiku, prostredníctvom ktorej sa vypočíta výsledok. To nám zabezpečí nemennosť, nakoľko čísla sú stále a použitím rovnakej matematiky vzniká vždy rovnaký výsledok. Teda 1+1 sa vždy bude rovnať 2 a nikdy nie 3, ani 1,999999.

V súčasnosti existuje niekoľko algoritmov, ktoré možno použiť na hashovanie dát. Medzi najznámejšie patria MD5, SHA-1 a SHA-256 a tiež nový bcrypt. WordPress používa hashovanie prostredníctvom funkcie MD5.

Zahashovanie reťazca

Ako vyzerá zahashovaný jednoduchý reťazec 123456?

MD5: e10adc3949ba59abbe56e057f20f883e

SHA-1: 7c4a8d09ca3762af61e59520943dc26494f8941b

SHA-256: 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

bcrypt: $2a$10$tRF/o/QR/xy17xhgE3xjn.QpWWsOHvEerlsFapwZVRB8gQJao9Gfi

Teraz si pre ilustračné účely ukážeme lavínovitosť. Použijeme na to vyššie uvedený príklad s algoritmom MD5. String 123456 v MD5 vytvorí tento hash:
e10adc3949ba59abbe56e057f20f883e

Ak teraz zmeníme vo vstupnom reťazci jeden jediný znak, napr 123457, dostaneme radikálne odlišný výsledok: f1887d3f9e6ee7a32fe5e76f4ab80d63.

Vidíme, že tieto dva reťazce, hoci na vstupe vykazujú len miernu zmenu, vo výsledku sú úplne iné a prípadný hacker teda nemá možnosť na základe podobného výsledku vedieť, že „už je blízko“ k rozšifrovaniu kódu. 

A čo praktický život?

Teraz si povieš, že je to všetko síce veľmi pekné, ale čo z toho? Aký to má význam? Kde sa reálne používa hashovanie? 

Heslá
Asi najpodstatnejšie využitie nájdu hashe pri ukladaní a šifrovaní hesiel. Heslá do e-shopov, internet bankingu, e-mailovej stránky. Všetky heslá by sa v IT svete mali ukladať ako hashe. To znamená, že príslušná webová stránka musí byť vytvorená tak, aby s tvojim reálnym heslom do styku skoro vôbec ani neprišla. Ty zadáš heslo do príslušného formulára a ono sa ďalej zahashuje a spracováva sa ako hash. Dokonca aj v databáze musia byť všetky heslá uložené ako hash, nikdy nie ako raw string! Pokiaľ niekto programuje tak, že ukladá do databázy string (teda tvoje heslo tak ako je), ruky mu polámať!

To znamená, že aj pri zadaní hesla pri prihlásení sa do databázy na kontrolu neposiela tvoje heslo, ale len jeho hash. Tuto na obrázku vidíte, ako má WordPress uložené heslá užívateľov. Prvé je moje, môžete dešifrovať. 🙂 

Čiže preto, ak zabudneš heslo, po správnosti si ho nemôžeš nechať znovu preposlať, môžeš si ho len obnoviť, teda nastaviť nové. Stránka tvoje heslo nepozná, pozná len jeho hash. A ten ti je na nič (nezmienil som sa, že výsledkom hashu je iný hash). Preto ak ti nejaká stránka prepošle tvoje heslo, môžeš si byť istý, že ho má uložené ako raw string v databáze a od takej stránky ruky preč. Ešte ideálne, ak používaš všade rovnaké heslo, takým štýlom daná stránka môže získať tvoj prístup kade-tade…

Citlivé dáta
Ďalšie využitie hashu je pri citlivých dátach, napr. pri platobných transakciách cez platobné brány. Do banky posielaš na overenie číslo svojej karty, jej platnosť a CCV2 kód. Bolo by veľmi blbé, ak by tieto údaje niekto získal, lebo by si na tvoj účet mohol nakupovať. Preto sa nepoužívajú priamo tieto čísla, ale ich hashe. A tie sa aj medzi sebou porovnávajú. 

Sessions
Aj sessions používajú hashovanie. V článku o Cookies som sa o nich krátko zmienil. Uložené sú na serveri a na základe hashu vie server priradiť konkrétne dáta konkrétnym užívateľom. 

Indexácia, vyhľadávanie a overovanie
Hashovanie sa používa aj na indexovanie, vyhľadávanie a overovanie veľkého množstva dát (tzv. big data). Overovanie dát je charakteristický tzv. kontrolným súčtom, tzn. vypočíta sa hash z väčšieho množstva dát a ten sa porovnáva. Pokiaľ nastane nezhoda, vieme s určitosťou, že pôvodné dáta sú zmenené, či poškodené. Tieto operácie sa však týkajú väčších IT systémov, vo WordPresse takmer nemajú využitie, len pri naozaj špecifických projektoch.

Brutal force attack

Existuje niekoľko spôsobov, ako sa pokúsiť o rozšifrovanie hashov, resp. o prelomenie hesiel. Jeden z najpoužívanejších je tzv. Brutal force attack (útok brutálnou silou). 

V praxi ide o nejaký jednoduchý skript, ktorému môžeme zadať parametre a on následne automatizovane vkladá rozličné heslá do políčka pre heslo, čím sa ho snaží uhádnuť. 

Ak by som mal heslo jozef59 a zabudol by som ho, mohol by som použiť brutal force attack script na to, aby sa pokúsil heslo uhádnuť. Ako vstupný parameter by som mu zadal Jozef. Po spustení by skript skúšal asi tieto heslá:

  • Jozef
  • jozef
  • JOZEF
  • JozeF
  • jozef0
  • jozef1
  • jozef2
  • jozef59

Až by sa napokon dostal k môjmu reálnemu heslu. Tento útok by bol teda úspešný a heslo by bolo prelomené. V skutočnom svete je však úspešnosť BFA mizivá, takmer nulová. Skripty môžu bežať aj niekoľko dni a vyskúšať za tú dobu miliardu kombinácií, ale trafiť sa nemusia. Dôvodov je najmä obrovská variabilita, nakoľko pri heslách sú podstatné aj veľké/malé písmená, heslá, medzery a špeciálne znaky. 

Navyše, vývojári IT systémov sa s týmto problémom vysporiadali relatívne rýchlo a to zavedením tzv. „Throttlingu“. Throttle (z ang. „škrtiaca klapka“) spôsobuje, že je možné zadať chybné heslo len niekoľkokrát, následne dôjde k zablokovaniu účtu, čiže aj keď by si zadal správne heslo, systém ťa neprihlási. Až po určitom čase, resp. po odblokovaní účtu sa dá znova skúsiť zadať heslo. 

Tento throttling poznáš určite zo SIM karty (3 krát zlý PIN a dosť), alebo aj z Androidu locked screen, keď zadáš niekoľkokrát zlé heslo, musíš nejakú časovú dobu počkať, kým sa bude dať znova skúšať heslo. 

 

Takže toto je hashovanie. Veľmi potrebný a využívaný systém vo svete IT systémov.

Pozrite aj

50 odtieňov odžubu

Dobre bráško. Už ma to nebaví. Aby si vedel, ako sa vyhnúť podvodom, musíš najprv vedieť, ako sa veci majú a ako fungujú. Potom nenaletíš…

E-mail v mobile

Ako tie mailové servery vlastne fungujú a ako dostať e-maily do telefónu?