Informačná bezpečnosť 2 Hash funkcie Ján Karabáš
Aplikácie hash funkcií Overovanie integrity" Overovanie autenticity" Identifikovanie dát" Deštrukcia dát" Generovanie pseudonáhodných čísel" Generovanie neslovníkových hesiel
Jednosmerné funkcie Hash: angl. zomlieť, zmiešať (vb.), miešaný šalát, mäsová zmes (no.); octothorp, číslo, počet (no.)" Matematický význam: jednosmerná funkcia" Majme funkciu. Funkcia f je jednosmerná, ak existuje efektívny algoritmus na vyčíslenie hodnoty f(x) pre všetky a zároveň pre všetky je vyčíslenie (algoritmicky) ťažký problém.
Kryptograficky bezpečné hash- funkcie Funkcia je kryptograficky bezpečná hashfunkcia ak: (1) f je efektívna: algoritmus pre vyčíslenie f(m) je ľahký$ (2) f je jednosmerná: pre všetky hashe h je výpočet správy algoritmicky ťažký problém (preimage resistance, jednosmernosť)% (3) je ťažké nájsť (všetky) dvojice {m,m } také, že f(m)=f(m ) (collision resist.).% (4) f nie je injektívna; napriek tomu je je ťažké pre danú správu m nájsť správu m takú, že f(m)=f(m ) (2nd preimage resistance, injektívna odolnosť).% (5) všetky algoritmy pre hľadanie vzoru, kolízie ev. druhého vzoru sú bruteforce
Birthday problem (1) Majme skupinu n ľudí a položme otázku, či v tejto skupine je dvojica, ktorá sa narodila jeden deň v roku. Aká je pravdepodobnosť tejto udalosti?$ (ak n=30, p(30) 70%)$ Predpokladáme uniformné pravdepodobnosti dátumov narodenia
Odolnosť voči kolízii Majme množinu hodnôt mohutnosti H, pričom pravdepodobnosť výberu každej hodnoty z tejto množiny je uniformná, t.j. (1/H)." Vyberme náhodne n hodnôt. Pravdepodobnosť, že vo výbere sú aspoň dve hodnoty sú rovnaké je zhruba Počet výberov z danej množiny, kde nastane kolízia s pravdepodobnosťou p je Tabuľka: viď tabuľku na poslednom slajde
Birthday problem (2) Majme skupinu n ľudí, a vyberieme konkrétny deň v roku (napr. 8. 4.). Aká je pravdepodobnosť, že v tejto skupine je aspoň jeden človek, ktorý sa narodil práve v tento deň?$ (ak n=30, p(30,d) 8%)$ Predpokladáme uniformné pravdepodobnosti dátumov narodenia
Merkle Damgårdova konštrukcia Metóda získania hashu odolného voči kolíziám (1979)$ Inicializačný vektor je konštantná postupnosť, zabezpečujúcia prvok zmätenia a dobre definovaný štart tvorby hashu" Vstupom je hodnota Pad(M), ktorá je vytvorená spojením správy M a jednoznačne definovaných doplňujúcich bitov$ Vlastnosti Pad(M): 1. M je prefix Pad(M)$ 2. M1 = M2 Pad(M1)=Pad(M2)" 3. M1 M2 Pad(M1) a Pad(M2) sa líšia príponou f je jednosmerná funkcia$ Finalizačná funkcia je často kompresná funkcia, zabezpečuje SAC a BIC výstupu
MD5 (padding, doplnenie) Hashovacia funkcia navrhnutá R. Rivestom (1992)$ Vstupom je správa M0 ľubovoľnej dĺžky (ako bitové pole); začneme doplnenie s hodnotou M := M0$ Pripojíme bit s hodnotou 1: M := M 1" Pokým M % 512!= 448, M := M 0" Pridáme dĺžku pôvodnej správy ako 64-bitovú hodnotu, M := M len(m0)" Táto správa zodpovedá definícii Merkle Damgårdovej konštrukcie" Správu M rozdelíme na 512-bitové bloky
MD5! 64 iterácií nad 512 bitovým blokom$ A,B,C,D,M j,k i sú 32-bitové slová (registre)$ A0 = 0x67452301, B0 = 0xefcdab89, C0 = 0x98badcfe, D0 = 0x10325476 pole M[j] je postupnosť 16tich 32-bitových slov bloku$ pole K[i] je konštantná postupnosť 64och 32-bitových hodnôt$ i prebieha rozsah 0..63$ i j Fi (B,C,D) 0 i 15 i (B & C) (!B & D) 16 i 31 (5*i+1) % 16 (D & B) (!D & C) 32 i 47 (3*i+5) % 16 (B ^ C) ^ D 48 i 63 7*i % 16 C ^ (B!D) operácia je sčítanie vektorov modulo 2, bez prenosu (xor registrov)
MD5! hodnoty K[i] sú konštantné 32-bitové slová, pričom K[i] = floor(abs(sin(i+1)) << 32); pre i v rozsahu 0..63.$ operácia <<< s je ľavá rotácia o vopred zadaný počet bitov s, pre 0 i 63 7 12 17 22 7 12 17 22 7 12 17 22 7 12 17 22 5 9 14 20 5 9 14 20 5 9 14 20 5 9 14 20 4 11 16 23 4 11 16 23 4 11 16 23 4 11 16 23 6 10 15 21 6 10 15 21 6 10 15 21 6 10 15 21 Výstupné hodnoty registrov jednej iterácie sú vstupom pre ďalšiu iteráciu.$ Pokiaľ tvoríme hash pre jeden blok, potom MD5(M) = A B C D, po 64och iteráciách$ Pokiaľ nasleduje ďalší blok, potom A0 = A, B0 = B, C0 = C, D0 = D MD5( \x0 ) = d41d8cd98f00b204e9800998ecf8427e
MD5 s kľúčom Nastavíme štartovacie hodnoty A 0, B 0, C 0, D 0 na ľubovoľné tajné hodnoty$ Bežný proces pri komunikácii vo fixovanej relácii; overovanie pomocou session-id% Užívateľ chce nadviazať reláciu s overovaním integrity a požiada hostiteľa o session-id, ktoré použije ako štartovaciu hodnotu pre MD5 algoritmus$ Každý blok je podpísaný MD5 hashom, ktorý bol odštartovaný jedinečným session-id (heslo na jedno použitie). Tento hash voláme Message Authentication Code - MAC$ Host overí integritu a autenticitu prijatých dát tak, že spočíta hash so štartovacím vektorom rovným session-id$ Táto technológia sa požíva(la?) napríklad v PHPSessionId$ MD5 je náchylné na Length extension attack!" Útočník zachytí správu aj jej hash; nepozná síce session id, ale správu upraví MD doplnením a pripojí svoje dáta. Nový hash vypočíta tak, že zoberie ukradnutý hash a použije ho ako vstupný vektor, pričom svoje doplnené dáta použije ako pokračujúci blok.$ Nový hash obsahuje informácie o pôvodnom session-id a je považovaný hostiteľom za autentický!$ Riešenie: MAC = hash2(kľúč hash1(kľúč,správa))
Linuxové heslá - starý spôsob Heslá sú oddelené od užívateľských mien (shadow)$ Na žiadnom mieste nie je uložené heslo priamo, ale iba jeho hash$ Príklad $ Slovníkový útok (dictionary based attack): útočník predpočíta najfrekventovanejšie heslá pre každý systém, na ktorý útočí$ Kolízny útok (rainbow attack): hash funkcie sú náchylné na kolízie - útočník predpočíta zhruba 2 n/2 hashov a podsúva priamo tieto hodnoty
Linuxové heslá - nový spôsob Systém vygeneruje pri prvotnom uložení jedinečnú náhodnú hodnotu - SALT (šírky 64 bit)$ HESLO sa spojí s hodnotou SALT, vygeneruje sa hash, ktorý sa uloží, spolu s hodnotou SALT$ Užívateľ poskytuje iba heslo, systém pripojí SALT a porovná výsledok s uloženou hash hodnotou$ Príklad: heslo je mojeheslo, salt je 12345678; v /etc/shadow je riadok obsahujúci reťazec $1$12345678$TJMHYQoO2VKNvSCQUMhAF. Spojenie HESLO + SALT: V skutočnosti sa generuje postupnosť 1000 čiastkových hashov$ Indikátor algoritmu v /etc/shadow $1 MD5 $2a Blowfish (salt je heslo) $5 SHA-256 $6 SHA-512 SHA-256 a SHA-512 sú modernejšie hashovacie funkcie (algoritmus SHA-2), ktorých hashe majú 256 (512) bitovú dĺžku, t.j. sú omnoho rezistentnejšie voči kolíziám ako MD5 (s dĺžkou hashu 128 bitov)$ SHA sa používa aj pre overenie konzistencie dát v GIT (algoritmus SHA-1) s dĺžkou hashu 160 bitov.
Birthday bound