Hash

Zadejte text a zjistěte jeho hash!

Hashovací (hešovací) funkce je funkce, která určitým složitým matematickým postupem převede vstupní data (to může být text, ale klidně i obrázek nebo jiný soubor) do speciálního čísla. Toto číslo se nazývá hash nebo otisk. Je to takový "kontrolní součet".

Hash se používá především k porovnávání dat bez nutnosti znát data samotná - běžně na hash narazíte při indexaci tabulek, bezpečném ukládání hesel nebo porovnávání velkých souborů.

Takzvaný hash (nebo otisk) má několik užitečných vlastností:

  • velmi malou změnou na vstupních datech (na obraze) vznikne velký rozdíl na výstupu (na otisku)
  • Hash má pro libovolně dlouhý vstup vždy stejně dlouhý výstup
  • Z hashe se dají původní data získat jenom útokem brutální sílou (není to totiž kódování nebo šifrování)

Jako ukázku si můžeme uvést využití hashovacích funkcí SHA1 a MD5, které si tady na webu můžete sami vyzkoušet.

MD5 vytváří otisk dlouhý 128 bitů, který se dá vyjádřit i jako 32 hexadecimálních čísel a také jako posloupnost 32 znaků (z určitého výběru).

SHA1 vytváří otisk dlouhý 160 bitů, tzn. 40 hexadecimálních čísel či 40 znaků.

Příklady hashe SHA1:

  • heslo -> 6e017b5464f820a6c1bb5e9f6d711a667a80d8ea
  • password -> 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
  • passwork -> 727fc2719077df003bf305600d2bec45c060e526
  • Eli, pan Larsen nesral na pile -> 825a9fc0ee1a1af574a955ad7c2656db6153184e
  • Eli, pan Larsen nespal na pile -> 4c1fd04c581afbc0282c55a9806b8f86058825a4

Jak je vidět, tak i minimální změna vstupního řetězce vede k velkému rozdílu na výstupu. Mimochodem čtvrtý příklad se čte stejně zezadu jako zepředu ;-).

Využití pro zabezpečení hesel

Představte si, že nějaká firma ukládá hesla svých zákazníků do databáze - ale bojí se, aby je někdo nezneužil - mohl by je někdo hacknout nebo by mohl hesla zneužít dokonce vyhozený administrátor, který k databázi měl v minulosti přístup. Nejlepší by oboustranně bylo, kdyby heslo znal jen uživatel - ne provozovatel stránek.

Proto je pro takovouto firmu, a nejenom pro ni, lepší používat jenom otisky hesel. Pokud si tak někdo za heslo vybere inteligentně heslo, v databázi se může uložit třeba jako SHA1 otisk 6e017b5464f820a6c1bb5e9f6d711a667a80d8ea (nebo MD5 otisk 955db0b81ef1989b4a4dfeae8061a9a6).

Když se pak uživatel chce přihlásit, do přihlašovacího formuláře napíše své heslo-heslo. Formulář neodešle toto heslo, ale pomocí nějaké hešovací funkce vytvoří tento otisk. Pokud se bude otisk z formuláře shodovat s otiskem v databázi, vyhodnotí se přihlášení jako úspěšné.

Díky "pokroku" to ale dlouho netrvalo a vznikly tabulky otisků - takzvané "duhové tabulky", rainbow tables. Jsou to jednoduše soubory, které obsahují velké množství různých možných i nemožných kombinací hesel s jejich otisky (kompletní tabulky v určitém rozsahu můžou mít několik GB i TB). Konkrétní příklad může být třeba tabulka MD5 otisků hesel od 6 do 20 znaků obsahující písmena a čísla.

Tato tabulka se pak použije do některého programu provádějícího tzv. brute force attack, útok brutální silou: hesla se jednoduše zkouší jedno po druhém dokud se nenajde to správné (což na průměrném počítači může trvat až miliardy let).

Solení hesel

Ani miliardy let ale nemůžou být uklidněním - hesla se proto kvůli ochraně před těmito tabulkami "solí" (salting), přidává se k nim sůl, což je určitý - většinou různý, ale může být stálý - "přídavek" k heslu. Nevytváří se tak otisk samotného hesla, nýbrž hesla buď na konci nebo na začátku (nebo uprostřed) "osoleného".

Dobrá ukázka může být třeba SHA1 otisk z heslo (viz výše) - určitě se nachází v rainbow tables a dokonce i na Googlu. Zkuste vygooglit "6e017b5464f820a6c1bb5e9f6d711a667a80d8ea" a bez problémů zjistíte, že je to hash právě od heslo.

Proto si vymyslíme nějakou sůl, nejlépe náhodnou, a vytvoříme SHA1 hash z osoleného hesla. Vyjde nám třeba 831d74589290a4c69903a6809cb9d38fbb043c19, což už na Googlu luštitel pochopitelně nenajde. Stejně tak by narazil při použití rainbow tables - ty totiž většinou obsahují otisky běžných slov a jejich kombinací (kdyby měly uvažovat všechny možné kombinace hesel s náhodnou solí, byly by ohromně veliké). A i při brute force útoku by tvralo dlouho, než by se původní heslo našlo (je to heslo_dFr86oViy).

Vždy je lepší mít pro každé použití jinou sůl - třeba ji brát jako prvních několik písmen jména uživatele nebo jako otisk času registrace. Výsledkem je totiž, že i když si dva uživatelé vyberou stejné heslo, budou ho mít uložené jako jiný otisk (což zloději hesel rozhodně práci neusnadní).

Nejvyšší stupně zabezpečení

Pro služby, které potřebují nejvější stupeň zabezpečení, ale ani osolené heslo nemusí být dostatečné při použití nevhodného algoritmu (funkce). U MD5 už byla nalezena kolize (u SHA-1 ještě ne, ale je to technicky možné). Kolize je situace, kdy dva jiné vstupní údaje vygenerují stejný otisk - pro bezpečnost je zásadní, aby takové vstupní údaje nešly najít v rozumném čase.

Proto finanční instituce kromě jiného zabezpečení (SMS verifikace, HTTPS, přihlašovací údaje nezávislé na číslu účtu nebo karty) často používají hned několik hashovacích funkcí a solí najednou aby dosáhly perfektního hashování. Novým směrem je při hashování i využívání XOR operátoru (exluzivní NEBO) namísto operátoru OR (NEBO). Tento operátor je jinak využíván poměrně vzácně, pro maximální zabezpečení je ale třeba.

Využití pro porovnávání

Hash se také používá pro porovnání dvou velkých vstupních dat (obrázků, textů, programů). Vlastnost, že každý vstupní údaj vytvoří rozdílný (ale stejně dlouhý) otisk, se zužitkuje při vyhledávání duplicitních souborů na disku nebo v databázi - kdybychom měli dva mnohagigabajtové soubory a chtěli bychom zjistit zda se přesně shodují bez hashe, museli bychom je porovnat od začátku do konce. S použitím hashe stačí porovnat jejich otisk. Ten vznikne z jejich částí (a tím pádem rychleji), bude také menší (tím urychlí porovnávání), ale stále stejně spolehlivý jako srovnání celých souborů.

Na stejném principu může hashování pomoci i při ověření toho, že soubor není poškozený nebo upravený. Softwarová společnost vydá patch (opravu chyb) ke svému programu, který nabídne svým uživatelům na internetu. U populárního programu ale hrozí, že se toho někdo chytne a do programu umístí svůj škodlivý kód, třeba trojského koně, a začne ho šířit. Většinu lidí nenapadne porovnat velikost jejich souboru s velikostí oficiálně uveřejněného souboru - a i kdyby, není problém zařídit, aby i infikovaný soubor měl stejnou velikost jako ten původní správný (smaže se část původního programu, protože nejde o jeho funkčnost, ale o šíření viru). Tvůrce viru se ale může snažit jakkoliv a hash se změní při jakékoliv úpravě.

Pokud tak uživatel nevěří svému antiviru, může porovnat hash svého souboru se správným hashem toho oveřejněného - a pokud se neshodují (tato situace nastala ve velkém třeba při šíření aktualizace Windows 7), soubor nespouštět. Právě hashe souborů se používají i při upozorňování na škodlivé programy.