Both sides previous revisionPrevious revision | |
hash [2023/09/27 13:14] – katarina | hash [2023/11/27 09:40] (current) – external edit 127.0.0.1 |
---|
====Funkcije sažetka (Hash funkcije)==== | ====Funkcije sažetka (Hash funkcije)==== |
**Hash funkcije**, odnosno **funkcije sažetka**, su determinističke matematičke funkcije koje ulaznu poruku pretvaraju u izlazni niz fiksne duljine, tipično u heksadekadskom obliku, pri čemu će ista ulazna poruka uvijek rezultirati istim izlaznim nizom. | **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:\\ | Da bi hash funkcija bila sigurna, mora posjedovati sljedeća svojstva:\\ |
| |
**1) Otpornost na izračunavanje originala ili prva domenska otpornost (preimage resistance)**\\ | **1) Otpornost na izračunavanje originala ili prva domenska otpornost** //(preimage resistance)//\\ |
H=h(M) M=h<sup>-1</sup>(H) ne postoji | 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)**\\ | **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 | Za poznati M i H=h(M) je nemoguće pronaći M’ koji daje isti H |
| |
**3) Otpornost na kolizije (collision resistance)**\\ | **3) Otpornost na kolizije** (//collision resistance//)\\ |
Nemoguće je pronaći bilo koje dvije poruke M<sub>1</sub> i M<sub>2</sub> za koje se dobiva isti sažetak h(M<sub>1</sub>)=h(M<sub>2</sub>) | Nemoguće je pronaći bilo koje dvije poruke M<sub>1</sub> i M<sub>2</sub> za koje se dobiva isti sažetak (//hash//). h(M<sub>1</sub>)=h(M<sub>2</sub>) |
| |
**4) Difuzija**\\ | **4) Difuzija**\\ |
Svaka, pa i najmanja promjena ulaznog podatka rezultira velikom i naizgled slučajnom promjenom na izlazu | 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 kak bismo znali da poruka nije izmjenjena, hashiranju lozinki radi sigurnije pohrane, autentifikaciji [[https://www.cert.hr/wp-content/uploads/2019/04/CCERT-PUBDOC-2007-02-182.pdf|digitalnih potpisa]] i u blockchainu kriptovaluta. | 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 [[https://www.cert.hr/wp-content/uploads/2019/04/CCERT-PUBDOC-2007-02-182.pdf|digitalnih potpisa]] i u blockchainu kriptovaluta. |
| |
Neke od poznatijih hash funkcija su [[md5|MD5]], [[sha1|SHA-1]], [[sha2|SHA-2]] i [[sha3|SHA-3]]. | Neke od poznatijih hash funkcija su [[md5|MD5]], [[sha|SHA-1]], [[sha|SHA-2]] i [[sha|SHA-3]]. |
| |
Jedan od osnovnih napada na hash funkcije je **rođendanski napad**. Rođendanski napad temelji se na statističkoj anomaliji rođendanskog problema. Matematika kaže - vjerojatnost da dvije osobe u dvorani u kojoj je ukupno=1.2 x 3651/2 = 23 ljudi imaju isti dan rođendan je veća 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 je veća od 50%, gdje je n duljina sažetka u bitovima. | 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š jedan od zanimljivih napada na hashirane podatke je **Rainbow table napad**. Ovaj napad svoj naziv duguje šarenoj tablici unaprijed izračunatih sažetaka najčešćih lozinki. Cilj napada je dobiti lozinke spremljene u bazi podataka. Napadač uspoređuje unaprijed izračunate sažetke jedan po jedan sa sažetcima spremljenim u bazi podataka, sve dok ne nađe poklapanje. Pomoću tog poklapanja lako može doći i do ostatka lozinki u istoj bazi. Ovakav napad može se spriječiti korištenjem salta – slučajnih podataka koji se nadodaju na ulazne tijekom sažimanja. | 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=== | ===Izvori=== |
[3] Kriptografija i kriptoanaliza, predavanja, FER\\ | [3] Kriptografija i kriptoanaliza, predavanja, FER\\ |
[4] Budin, L.; Golub, M; Jakobović, D., Jelenković, L (2010.) (2013.), Operacijski sustavi, Element, Zagreb\\ | [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 | [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/\\ |