Povijest rasplinjavanja
Generička hash funkcija posebna je vrsta programske funkcije koja se koristi za mapiranje podataka proizvoljne veličine u podatke od fiksne veličine. Hash funkcije nastale su iz potrebe za oblog podataka kako bi se smanjila količina memorije potrebna za pohranu velikih datoteka. Najpopularniji slučaj upotrebe hash funkcije je za drugu specifičnu strukturu podataka koja se naziva a hash tablica, koja se naširoko koristi za brzo pretraživanje podataka. Hash funkcije pomažu ubrzati traženje tablice ili baze podataka otkrivanjem bilo koja dva potpuno ista hasha.
Oni također pomažu umanjiti oznake za ogromne datoteke poput mp3-a, PDF-a ili slika kako bi rad s ovim prilično velikim vrstama datoteka bio upravljiv. Za brzu identifikaciju, ključni zahtjev hash funkcija je da one izbaci niz alfanumeričkih znakova fiksne duljine.
Iako je osnovni razlog nastanka hash funkcije proizašao iz potrebe za sažimanjem sadržaja, sekundarna je korist ubrzo postala osnovna komponenta raspršivanja: jedinstveno jedinstveni identifikatori. U idealnom slučaju, prilikom raspršivanja više poruka, nikada dvije različite poruke ne bi trebale vraćati isto raspršivanje. Dvije različite raspršene poruke koje rezultiraju istim izlaznim raspršivanjem nazivaju se a sudar.
Iz perspektive upravljanja bazom podataka, to bi značilo da dva različita objekta na kraju budu pohranjena u istoj ćeliji – nije dobro ako jedan želi definirati jedinstveno jedinstvene identifikatore. Ako uzmemo u obzir hash funkciju sa beskonačni ulazi (što znači da možemo hashirati bilo koji niz), možemo izvesti upravo ono zašto su sudari zapravo neizbježno.
Načelo golubije rupe
Unutar kriptografske matematike postoji koncept nazvan princip golubije rupe koji kaže da ako (n) elemente uklopimo u (m) prostore gdje n > m, tada u principu postoji barem jedan prostor (m) koji zauzima više od dva elementa (n).
Primjerice, pet osoba provjerava kapute u jednom od tri dostupna kubusa. Načelom golubije rupe, budući da je broj uskladištenih slojeva (n) veći od raspoloživih kockica (m), zajamčeno je da barem jedan mladunac sadrži više od jednog sloja.
Tipično softverske inženjere zanimaju hash funkcije s beskonačna domena (to znači da uzimaju kao ulazne nizove svih mogućih duljina) i a konačni domet. Opet slijedeći princip golubije rupe, budući da je naš domet (n) manji od naše domene (m), slijedi da na mora postojati najmanje jedan sudar. Učinkovita hash funkcija stoga samo nastoji minimizirati broj sudara – zašto će to za trenutak postati jasnije, ali za sada, vratimo se povijesti hashova.
Iako su hash funkcije potekle strogo iz održavanja baze podataka & potrebe upravljanja, koje su prije svega favorizirale brzinu, njihova je korisnost brzo evoluirala. Posebna grana hash funkcija koja je favorizirala privatnost i sigurnost, & transparentnost je ubrzo ušla u polje; grana hash funkcija koja će ostati u fokusu ovog članka: kriptografske hash funkcije.
Kriptografsko raspršivanje
Kriptografske funkcije raspršivanja, kako naziv prikladno govori, pogoduju očuvanju apsolutno neometanih poruka. Iako je minimiziranje sudara dobra praksa za druge hash funkcije, posebno za kriptografske funkcije, minimiziranje sudara je zahtjev. Umjesto da maksimiziraju uslužni program za brzi scenarij pretraživanja baze podataka ili tablice, kriptografske funkcije raspršivanja grade se imajući na umu kontradiktorni scenarij: onaj u kojem razbijač koda (kriptoanalitičar) aktivno pokušava izazvati koliziju. Sada ćemo definirati standardne oznake hash funkcije & uspostaviti principe hash funkcije unutar kriptografske perspektive.
Oznaka funkcije hasha
Generička kriptografska hash funkcija ima dva ulaza: poruku koju će komprimirati ili hash (x) & javni ključ (ključevi) koji predstavlja izlaz našeg hasha fiksne duljine u alfanumeričkim znakovima. Naš raspršeni rezultat naziva se sažetkom poruke ili jednostavno sažetkom (x *). Ovo izgleda ovako:
H (s, x) = x *
Utrošimo ovu notu hodajući kroz primjer stvarnog života raspršivanjem niza pomoću prethodno standardne funkcije raspršivanja nazvane MD5. Recimo da želimo koristiti MD5 za heširanje “Hello World!” niz. Također znamo da prema zadanim postavkama MD5 uvijek daje niz od 128 bitova (0 & 1 ’). Ova oznaka izgledala bi na sljedeći način:
H (128, x) = ed076287532e86365e841e92bfc50d8c
Zapravo, ako nastavite & pokušajte pružiti MD5 hash funkcija “Hello World!” i sami biste trebali vidjeti potpuno isti rezultirajući hash. Super. Krenimo sada prema postavljanju oznake sudara; uz prethodne varijable H, s, x, & x * sada uvodimo drugu poruku (x ’). Numerički, dolazi do sudara kada se rasprši dvije različite poruke (x & x ’) rezultira potpuno istim sažetkom poruke (x *):
Ako je H (128, x) = H (128, x ’), kaže se da naša hash funkcija (H) ima sudar u x & x’.
Sada smo postavili oznaku za trenutni standard obilježja kriptografije hash funkcije; ako protivnik može izvedivo (računski govoreći) izazvati sudar, hash funkcija više se ne smatra praktički sigurnom.
Zatvaranje misli do sljedećeg puta
Posljednja matematička definicija je mjesto gdje živi fascinantni catch-22 za praktičnost hash funkcije. Funkcije raspršivanja nastale su iz potrebe za komprimiranjem & izlaze standardizirani jedinstveni podaci radi praktičnosti pohrane, što znači da ispljuju pseudoslučajne nizove a fiksna duljina. Ipak, kako bi se stvorio potpuno otporan na sudar hash funkcija, svaka pojedinačna poruka (x) trebala bi imati raspršeni izlaz datoteke iste dužine kao i ulaz. Bez hashova fiksne duljine gubimo sposobnost da ih koristimo kao prikladnu strukturu podataka, no dodijelivši fiksnu duljinu, činimo da naša hash funkcija nije u potpunosti bez sudara.
PS – Siguran sam da su neki od vas pametnih kolačića primijetili da smo u našem primjeru MD5 zabilježili hash funkciju koja vraća niz duljine 128, ipak naš “Hello World!” hash vratio a 32 alfanumerički niz znakova. Vrati se sljedeći put & zaći ćemo dublje u hash funkcije kako bismo objasnili gdje je ta razlika potekla.