Funkcije sažetka (Hash funkcije)

Funkcije sažetka determinističke su matematičke funkcije koje ulaznu poruku pretvaraju u izlazni niz fiksne duljine, tipično u heksadekadskom obliku. Temeljno je svojstvo da će ista ulazna poruka uvijek rezultirati istim izlaznim nizom.

Da bi hash funkcija bila sigurna, mora posjedovati sljedeća svojstva:

1) Otpornost na izračunavanje originala ili prva domenska otpornost (preimage resistance)
Ne postoji funkcija koja za dani sažetak može proizvesti originalnu poruku.

2) Otpornost na izračunavanje poruke koja daje isti sažetak ili druga domenska otpornost (2nd preimage resistance)
Za poznati M i H=h(M) je nemoguće pronaći M’ koji daje isti H

3) Otpornost na kolizije (collision resistance)
Nemoguće je pronaći bilo koje dvije poruke M1 i M2 za koje se dobiva isti sažetak (hash). h(M1)=h(M2)

4) Difuzija
Svaka i najmanja promjena ulaznog podatka rezultira velikom i naizgled slučajnom promjenom na izlazu.

Hash funkcije osiguravaju integritet, sigurnost i efikasnost u verifikaciji digitalnih podataka i osiguravanju digitalne komunikacije. Koriste se u provjerama integriteta kako bismo znali da poruka nije izmijenjena, sigurnijoj pohrani lozinki (umjesto u jasnom tekstu, lozinka se prije pohrane u bazu provuče kroz neku hash funkciju), autentifikaciji digitalnih potpisa i u blockchainu kriptovaluta.

Neke od poznatijih hash funkcija su MD5, SHA-1, SHA-2 i SHA-3.

Jedan je od osnovnih napada na hash funkcije tzv. rođendanski napad. Rođendanski napad temelji se na statističkoj anomaliji rođendanskog problema. Vjerojatnost da dvije osobe u dvorani u kojoj je ukupno 1.2 x 365/2 = 23 ljudi imaju isti dan rođendan veća je od 50%. Isto tako, vjerojatnost da dvije poruke iz skupa od k=1.2 (2n )1/2 = 1.2x2n/2 poruka daju isti sažetak veća je od 50%, gdje je n duljina sažetka u bitovima.

Još je jedan od zanimljivih napada na hashirane podatke tzv. Rainbow table napad. U takvom napadu napadač uspoređuje hashirane lozinke s unaprijed izračunatom tablicom sažetaka. Napadač uspoređuje unaprijed izračunate sažetke jedan po jedan sa sažetcima spremljenim u bazi podataka sve dok ne nađe poklapanje.

Rođendanski napad može se spriječiti konstrukcijom dobre hash funkcije. Funkcija mora biti takva da se ne mogu u razumnom vremenu naći dva ulaza koji će rezultirati istim sažetkom. To se može postići tako da hash funkcija daje dug izlaz. Nemoguće je napraviti hash funkciju koja će za apsolutno svaki ulaz dati različit izlaz jer je prostor mogućih ulaza beskonačan, a duljina sažetka ograničena. Rainbow table napad sprečava se korištenjem tzv. salt hashinga.

Salt hashing

Salt hashing je metoda koja se koristi za hashiranje osjetljivih podataka, primjerice lozinki. Podatku se prije ubacivanja u funkciju sažetka dodaje još jedan nasumično generiran podatak (salt). Dodavanje ide najčešće na kraj (append) ili na početak (prepend), ali može ići na bilo koje mjesto. Nakon toga se u bazu podataka zapišu korisničko ime, sažetak lozinke zajedno sa saltom i sam salt. Kad se korisnik želi ulogirati u sustav i upiše lozinku, njoj se dodaje onaj salt koji je zapisan pored tog korisnika u bazi podataka i provjerava se odgovara li hash lozinke i salta zajedno onom hashu koji je zapisan u bazi. Na taj se način otežava napadaču da otkrije lozinku korisnika jer ne može koristiti unaprijed pripremljenu tablicu sažetaka.

Iako se na prvi pogled može činiti problematičnim što je salt zapisan u jasnom tekstu pored korisnika, treba uzeti u obzir da funkcije sažetka nemaju inverznu funkciju, odnosno nema načina kojim se može iz sažetka izravno dobiti original. Napadač baze podataka možda i vidi koji je salt iskorišten u generiranju sažetka, no ne može ga nikako eliminirati iz rezultata i izvući samo lozinku korisnika. Može eventualno dodavati taj salt na svaki svoj unos i nadati se da će pogoditi funkciju sažimanja koja je korištena. Nije nemoguće, ali se značajno produljuje vrijeme pretrage u odnosu na dosadašnje metode sažimanja, stoga se ova metoda smatra vrlo dobrom praksom i sve se češće koristi.

Izvori

[1] Christof Paar, Jan Pelzl, Understanding Cryptography, Springer-Verlag Berlin Heidelberg, 2009.
[2] https://platforma.hacknite.hr/challenges
[3] Kriptografija i kriptoanaliza, predavanja, FER
[4] Budin, L.; Golub, M; Jakobović, D., Jelenković, L (2010.) (2013.), Operacijski sustavi, Element, Zagreb
[5] https://www.cert.hr/wp-content/uploads/2019/04/CCERT-PUBDOC-2007-02-182.pdf
[6] https://auth0.com/blog/adding-salt-to-hashing-a-better-way-to-store-passwords/