Skip to content
On this page

Hashování

Ve světě kryptografie se setkáme se spoustou problémů, naším úkolem může být i ověření integrity souborů nebo autenticita, nejen důvěrnost.

Ukládání hesel

Představte si že jste napsali webovou stránku, třeba chatovací aplikaci. Představme si přihlašovací proces do této aplikace.

markdown
# registrace
aplikace dostane email a heslo -> email a heslo uloží -> ověření emailu -> uživatel je registrován
# přihlášení
aplikace dostane email a heslo -> podívá se zda existuje uživatel s tímto emailem a heslem -> uživatel je přihlášen

Neřešme teď kde budeme uživatele ukládat, podívejme se spíš jak uživatele ukládáme. V tomto případě ukládáme email i heslo tak jak je dostaneme, to však bude velký problém pokud někdo stránku hackne, instantně má přístup ke všem heslům a přiřazených emailů.

V perfektním světě by toto nebyl problém, vždyť každý používá pro každou aplikaci jiné heslo a v lepším případě i jiný email. Bohužel, nežijeme v perfektním světě, po pravdě kdo z nás nikdy nevyužil dvě stejná hesla nebo nepoužil heslo jako heslo123 že?

No to je jednoduché! Teď jsme se učili že můžeme heslo šifrovat! To je sice hezké, ale co za šifru použít? Ani symetrická ani asymetrická šifra nám nepomůže, protože někde existuje heslo nebo klíč, který všechna hesla může dešifrovat, proto můžeme použít hash.

Hashování

Na rozdíl od šifry, hashovování je proces, kdy vezmeme vstup a zakódujeme ho takovým způsobem, že není možné získat originální hodnotu. Funguje to podobně jako násobení když vynásobíme 4 a 5, vyjde nám 20 a nevíme, zda originální čísla byly 4 a 5, 2 a 10 nebo 1 a 20. Samozřejmě proces hashování je mnohem komplikovanější, ale funguje na podobném principu.

Hello -> 185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969

Ukládání hashovaných hesel

Když se vrátíme k našemu originálnímu způsobu a zkusíme využít hashování, přihlašování bude fungovat takto:

markdown
# registrace
aplikace dostane email a heslo -> heslo zahashuje -> aplikace uloží email a hash hesla, originální heslo zahodí
-> uživatel je registrován
# přihlášení
aplikace dostane email a heslo -> heslo zahashuje -> zkontroluje zda existuje uživatel s tímto emailem a hashem hesla,
heslo zahodí -> uživatel je přihlášen

Hned si asi všimnete, že aplikace si nikdy neuloží heslo v originální formě, vždy jen jeho hash. To implikuje, že stejný vstup pro hashovací algorytmus bude mít vždy stejný výstup. Díky tomu že vždy ukládáme jen hash hesla, pokud někdo hackne naší databázi, stále nebude mít přístup k jednotlivým heslům.

Kontrola integrity souboru

Vrátím se k prvnímu odstavci této kapitoly, v kryptografii je třeba řešit i jiné problémy než důvěrnost, v použitích, které jsem tady ukázal řešíme pouze důvěrnost - kdo může hodnotu číst, tedy ten kdo má šifrovací klíč, nebo v případě hashů nikdo. Hashování však může být využito i pro ověření integrity.

Jak už víme, stejný vstup hashovacího algorytmu bude mít vždy stejný výstup. Ale je tu ještě jednu vlastnost, kterou hashování má, každá drobná změna ve vstupu, ať už jde o jeden znak nebo dokonce o 1 bit, výstupní hodnota bude velice rozdílná, porovnejte příklad výše s hodnotou, kde je zapomenuté jedno l.

Helo -> 375738319e86099fe081fabee238c40d6f038959da383c99ca3fe146e5cc8b7e

Této vlastnosti můžeme využít například když stahujeme veliký soubor a chceme ověřit zda byl stažený celý. Většina stránek nám ukáže pár hashů souboru - například md5, sha256 nebo sha512. Jakmile se náš soubor stáhne, můžeme počítač nechat vypočítat jeho integritu pomocí příkazu sha256sum (případne md5, sha512) a porovnáme vygenerovaný hash s hashem na stránce. Pokud je hodnota stejná, soubor nebyl poškozen, pokud je hodnota jiná, soubor je poškozen a měli bychom ho stáhnout znovu.

shell
sha256sum anime-picture.png

Shrnutí

  • V kryptografii můžeme řešit i jiné problémy než jen důvěrnost
  • Hashování je proces, který ze stejného vstupu vždy vygeneruje stejnou neodhadnutelnou nevrátitelnou hodnotu
  • Hashování můžeme použít například na ukládání hesel nebo kontrolu integrity souboru