This is an old revision of the document!
HMAC
HMAC (Hash-based Message Authentication Code) je posebni tip MAC-a. On dodaje još jedan korak prije slanja poruke s MAC-om, a to je da poruku i MAC zajedno ubaci u funkciju sažetka. Također ne kriptira poruku, već se služi kao provjera da poruka nije mijenjana i da je pošiljatelj legitiman.
(opis kako se izračunava HMAC)
Klijent i poslužitelj dobiju svoj jedinstveni tajni ključ za komunikaciju. Kad šalje zahtjev, klijent prvo izračuna MAC poruke s pomoću tajnog ključa i nakon toga svoju poruku i MAC zajedno ubacuje u funkciju sažetka. Taj rezultat šalje unutar zahtjeva. Poslužitelj primi njegov zahtjev te ubacuje podatke iz zahtjeva i tajni ključ u istu funkciju sažetka da bi generirao svoj HMAC. Zatim usporedi svoj HMAC i onaj iz zahtjeva te, ako su isti, nastavlja dalje s procesiranjem zahtjeva. Ako nisu isti, zna da je zahtjev neispravan i odbacuje ga.
Prije ubacivanja u hash funkciju, treba izračunati MAC koji je uvijek fiksne veličine (S bitova). Veličinu bloka teksta poruke označavat ćemo s b. Također, postoje dva predefinirana niza bitova koji se koriste u daljnjem objašnjenju, ipad i opad, koji su definirani tajnim ključem. Poruku ćemo označavati s P, a i-ti blok poruke s Pi.
- S lijeve strane tajnog ključa K dodajemo nule dok mu veličina ne naraste do b. Taj nadopunjeni ključ označavat ćemo s K+.
- K+ xor-amo s ipad i dobivamo blok S1 koji je također veličine b.
- Dodajemo S1 s lijeve strane poruke P.
- Nad rezultatom koraka 3 primijenimo funkciju sažetka; istovremeno primijenimo i inicijalizacijski vektor da bismo osigurali fiksnu veličinu sažetka n.
- K+ xor-amo s nizom bitova opad da bismo dobili blok S2.
- S2 dodajemo na kraj sažetka koraka 4.
- Sve to zajedno ubacimo još jednom u funkciju sažetka.
Cijeli postupak prikazan je na sljedećoj slici:
HMAC danas koriste mnogi komunikacijski protokoli kao što su HTTPS, SFTP i FTPS. Koristi se i na poveznicama za resetiranje lozinke, verifikaciji email adresa pri stvaranju korisničkog računa i slično. Njegova je prednost što se koristi hash funkcijama koje se brzo računaju. Dakle, može se vrlo brzo s popriličnom sigurnošću provjeriti legitimitet korisničkog zahtjeva. Zato je idealan za internetsku komunikaciju jer ju ne usporava i time ne narušava korisničko iskustvo. Druga prednost je što, isto kao i MAC, funkcija vraća rezultat fiksne duljine. Korisnik može poslati iznimno dugačak zahtjev, ali HMAC ostaje iste veličine pa neće zauzimati puno resursa, što opet doprinosi brzini odgovora.
(kako je za razliku od MAC-a otporan na length-extension napade, čak ako se koriste hash funkcije koje koriste Merkel-Damgard konstrukciju)
Dodatna prednost HMAC-a je otpornost na length extension napade.
Neki algoritam hashiranja ranjiv je na njih uglavnom zato što funkcija sažetka koristi Merkle-Damgård konstrukciju. Naime, pri korištenju te konstrukcije podatak se dijeli u blokove i tako hashira. Zato je moguće iz hasha rekonstruirati interno stanje hash funkcije. Ako se nakon toga doda neki novi sadržaj, on se interpretira kao sljedeći blok poruke i neće se primijetiti da je poruka kompromitirana.
Ipak, HMAC neće biti ranjiv čak ni ako njegova funkcija sažetka koristi Merkle-Damgård konstrukciju. Razlog tomu je što on pri generiranju MAC-a ubacuje poruku i tajni ključ u hash funkciju, za razliku od MAC-a koji ubacuje samo poruku. Napadač u ovom slučaju ne može izolirati tajni ključ od poruke, odnosno ne može odrediti gdje je poruka, a gdje ključ. Dakle, ne može generirati MAC koji će primatelj interpretirati kao ispravan. Ako pokuša dodati neki novi sadržaj i pošalje zahtjev, primatelj će izračunati drugačiji sažetak poruke od onog koji je primio i shvatiti da poruka nije valjana.
Izvori
[1] Christof Paar, Jan Pelzl, Understanding Cryptography, Springer-Verlag Berlin Heidelberg, 2009.
[2] Henk C. A. Tilborg, Encyclopedia of Cryptography and Security, Springer-Verlag US, 2005.
[3] https://www.geeksforgeeks.org/what-is-hmachash-based-message-authentication-code/
[4] https://book.hacktricks.xyz/crypto-and-stego/hash-length-extension-attack
[5] https://deeprnd.medium.com/length-extension-attack-bff5b1ad2f70
