- HASH -
Jsem si jist, že drtivé většině z vás nejsou pojmy jako hashování či hashovací funkce zcela cizí a víte, že se s nimi v praxi nejčastěji setkáte v databázích, kde jsou takto skryta hesla uživatelů, případně další citlivá data. Přesto bych však nejprve rád na několika řádcích uvedl klíčové informace o této problematice.
Začneme pojmem hashovací funkce. Hashovací funkce je matematickým algoritmem, který ze vstupních dat, které zpravidla tvoří textový řetězec o libovolné délce, vytvoří řetězec o pevné délce, ten pak nazýváme hash (někdy též fingerprint, nebo česky: otisk, či miniatura).
Dojde-li byť jen k malé změně vstupních dat, výsledek hashovací funkce, tedy hash, bude výrazně odlišný. Zde je malá ukázka dvou textových řetězců a jim odpovídajících hashů, získaných pomocí hashovací funkce MD5.
Příliš žluťoučký kůň úpěl dábělské ódy
346596fe2358bcf8a30b6ad7154be215
Příliš žluťoučký kůň úpěl dábělské kódy
1b3833ffffbd9b8dca4ef824bfd48db5
Povšimněte si, že oba hashe jsou složeny z malých písmen a čísel a mají délku 32 znaků. Důležitým poznatkem je také, že hashovací funkce je jednosměrnou funkcí, ale zároveň je funkcí determinální, což znamená, že ze stejných vstupních dat vytvoří stejná hashovací funkce vždy stejný hash. Zároveň platí, že jeden hash odpovídá jedněm vstupním datům.
Teoreticky je tedy možné získat z různých vstupních dat identické hashe, neboť vstupní data jsou nekonečně variabilní a hash má vždy stejnou délku a je navíc omezen množstvím symbolů, ze kterých se může skládat. Nicméně kombinací je tolik, že si s tím prakticky vůbec nemusíme v běžném provozu lámat hlavu.
Z toho vyplývá, že není možné generovat vstupní data na základě hashe, dehashování však lze provádět porovnávací metodou, kdy porovnáváme hash neznámých vstupních dat s hashem vstupních dat, která známe a to buď hrubou silou tzv. brute-force metodou (pomalé, ale dříve či později se k výsledku dopracujeme… nebo se toho také nemusí dožít ani děti našich dětí), nebo s pomocí slovníku, či databáze hashů (rychlejší, ale k výsledku nemusíme dojít). Vyzkoušet si hashování různých textových řetězců můžete třeba na webu MiracleSalad.com.
Podobných hash generátorů je na internetu celá řada. K hashování citlivých dat však on-line generátory nepoužívejte. Nikdy nevíte, zda si provozovatel takového generátorů váš řetězec společně s výsledkem neukládá.
PHP má pak k hashování implementovanou funkci password_hash, to už se však dostáváme mimo rámec tohoto článku, více se o této funkci dozvíte v příslušné kapitole PHP manuálu.
Hashovacích funkcí existuje značné množství, jejich velice pěkně zpracovaný přehled naleznete v dokumentaci utility hashcat, o které bude za chvíli řeč.
Když je váš hash veřejným tajemstvím
admin
1234
password
pass
21232f297a57a5a743894a0e4a801fc3
81dc9bdb52d04dc20036dbd8313ed055
5f4dcc3b5aa765d61d8327deb882cf99
1a1dc91c907325c69271ddf0c944bc72
Google vám pod frází „decrypt hash“ a jí podobným nabídne mezi mnoha výsledky i nepřeberné množství online databází hashů o nichž jsem se již zmínil. V nich naleznete hashe běžných řetězců, vlastně se v drtivé většině jedná o hashe slabých hesel. Použijete-li někde slabé heslo, jakým jsou řetězce jako pass, password, 1234 a podobně, jeho hashování pak zcela postrádá smysl. Vyzkoušejte si na md5hashing.net zadat jeden ze čtyř výše uvedených hashů. Odpovídající vstupní data, která jsou uvedena nad nimi, získáte během několika vteřin.
Znovu tedy opakuji, i když je to rychlé a jednoduché a tedy lákavé, nepoužívejte k hashování skutečných citlivých dat on-line generátory.
Utilita hashcat…
O několik odstavců výše jsem odkazoval na velmi pěkně zpracovaný přehled různých typů hashů. Jistě jste si všimli, že stránka, na které se tento seznam nachází, je oficiální stránkou utility hashcat. O ní jsem mluvil úplně na začátku, Kali Linux má tuto utilitu k základní výbavě a jak již její název napovídá, slouží k obnově zahashovaných hesel.
Nyní si na praktickém příkladě ukážeme, jak hashcat funguje. Nejprve budeme potřebovat nějaký hash, vytvoříme si tedy hash řetězce pass1234:
b4af804009cb036a4ccdc33431ef9ac9
Hash si uložíme do souboru hashes.txt, můžeme jich do souboru uložit i víc, vždy jeden hash na řádek, hashcat si je bude brát jeden po druhém. I když hashcat umí pracovat metodou brute-force, my využijeme metodu s použitím wordlistu rockyou.txt, který obsahuje na 14 milionů záznamů a v Kali Linuxu jej naleznete v adresáři /usr/share/wordlists. Příkaz s hashcatem pak může vypadat třeba takto:
hashcat -m 0 -a 0 hashes.txt rockyou.txt
Kde -m určuje typ hashe (viz několikrát zmiňovaný přehled hashtypů na oficiální stránce hashcatu), v našem případě je to MD5, a -a metodu, kterou má hashcat k dehashování použít. Zadáte-li příkaz
hashcat --help
zobrazí se vám obsáhlé informace o všech možnostech utility, jaké lze k dehashování použít metody ( -a), jaké má ten který typ hashe číselné označení ( -m) atp. Informací opravdu je mnoho, proto doporučuji si je vypsat do souboru a pečlivě pročíst.
hashcat --help >hashcat.txt
gedit hashcat.txt
…a její sestřička oclhashcat
Další možností je místo hashcatu použít utilitu oclhashcat. Použití je obdobné, mezi utilitami je však jeden zásadní rozdíl: zatímco hashcat používá k dehashování výhradně CPU, utilita oclhashcat je postavená na využití GPU. Použití oclhashcat se tedy nabízí v případě, že máte grafickou kartu s výkonným čipem.