Poznámky z PVT 15. února 2011

Náležitosti hashovací funkce

Z libovolných dat udělá hash (někdy psáno jako heš, což vypadá vtipněji). Vždy stejným způsobem, bez klíče. Z výsledného hashe se o původní zprávě nedá říct vůbec nic. Podrobně řečeno, musí splňovat následující:

Vypadá to jako třikrát totéž, ale "nelze" se v těchto případech zásadně liší složitostí. Horní případ lze poměrně snadno, střední je známý pro některé funkce a pro speciální podmínky (například útok na MD5) a spodní lze obvykle jen hrubou silou, tzn. skoro vůbec.

Nejčastěji se používá funkce MD5, (jaksi oficiální, ale bezpečnost má mírně pochybnou), dále například SHA-1; na Wikipedii je hezký seznam.

Ukládání hesel

Je slušností neukládat hesla uživatelů v počítači přímo. Jednak proto, že možná stejné heslo používají i jinde (což by, mimochodem, dělat neměli) a především proto, že k datům na harddisku se může útočník dostat. Vystačíme si s hashem hesla: pak stačí pro ověření jen porovnat uložený hash s hashem toho, čím se uživatel pokouší přihlásit. Pokud se shodují, je to asi původní správné heslo.

Když se uloží pouze hash, není možné se do systému regulérně přihlásit, i když máte nakrásně přístup k celému disku; potřebujete znát původní heslo, aby vás systém pustil, a to na disku prostě není. Kdo má ukrutné štěstí, může natrefit i na jiné heslo se stejným hashem; tím by teoreticky bylo možné se přihlásit také.

Útoky

U všech slušných hashovacích funkcí je jediná možnost zkoušet různé vstupy a sledovat, co vychází. Když hledáme jeden konkrétní hash (při lámání hesla), můžeme všechny ostatní rovnou zapomínat. Pokud si jen chceme usnadnit práci pro příště, ukládáme si výsledky všechny - nejlépe do rainbow tabulky, o té až jindy.

Tak jako tak si nemůžeme dovolit zkoušet zprávy úplně náhodně: například tušíme, jaké znaky v hesle budou, nebo rovnou zkoušíme celá slova. Fantazii se meze nekladou.

Solení

Celý problém je v tom, že uživatelé mají hesla moc jednoduchá. To jde ale snadno: udělat z jednoduchého hesla heslo krutopřísné. Stačí za něj třeba přilepit znaky jako @#($*#@#(. Tím se vyřadí ze soutěže běžné rainbow tabulky a nezbývá než vygenerovat tabulku speciální nebo zaútočit hrubou silou.

Nalepovaný řetězec balastu se obyčejně označuje jako sůl. Může být uložený volně v systému, ale bezpečnosti jistě prospěje, když vygenerujeme každému uživateli jeho vlastní náhodnou sůl a někam ji skryjeme, aby nebyla tak na ráně.

Zabezpečené přihlašování po síti

Podobně je možné zajistit bezpečné přihlašování (do čehokoliv) přes jinak nezabezpečené spojení. Od serveru si nejdříve vyžádáme náhodnou sůl - v tomto případě se označuje jako nonce, používá se jen pro jedno přihlášení. Tu nalepíme na svoje heslo, celé to hashneme a pošleme. Server zná naše heslo a může tedy snadno ověřit, že jsme jej zadali správně.

Posílané údaje ale záleží na soli, kterou dostaneme od serveru, a tedy je nemůže nedokáže vytvořit nikdo, kdo heslo nezná; může odposlouchávat spojení, jak chce. V tomhle popsaném postupu je ale heslo uložené na serveru přímo - bylo by potřeba použít výrazně složitější triky, aby to tak nebylo.

Ověřování pravosti souborů

Když se chceme jen ujistit, že nenastala náhodná chyba při stahování, hodí se lépe použít kontrolní součet - je o něco rychlejší a může o chybě něco napovědět. Hashování souborů má smysl, když se bojíme, že jej někdo cíleně narušil. Kontrolní součet na to pak nestačí, protože chytrý útočník určitě dokáže soubor změnit tak, aby se kontrolní součet zachoval. Hash nám zajistí, že to nejde.

Takhle se používají u důležitých souborů (třeba obraz CD s operačním systémem ke stažení) nebo u bezpečnostních maniaků. Taky jsou nezbytnou součástí Bittorrentu.

Hashovací funkce se dají použít i jinými zvláštními způsoby; nejzábavnější je Geohashing.