Jak se ukládá heslo
Při přihlášení musí server poznat, že zadané heslo sedí. Nejjednodušší by bylo heslo uložit v textové podobě a při přihlášení ho porovnat s tím, co zadal uživatel. Slušně postavený web ale heslo v databázi nikdy nemá.
Heslo v čitelné podobě
Když server ukládá hesla v čitelné textové podobě, stačí jeden únik databáze a útočník má všechna hesla rovnou v ruce. Vidí je ostatně i každý správce, který se do databáze podívá.
Přesně tohle se v roce 2009 stalo službě RockYou. Uniklo přes 32 milionů hesel v čitelné podobě. Seznam rockyou.txt, který z úniku vznikl, se dodnes používá jako slovník při lámání hesel.
Když vám web po kliknutí na „Zapomenuté heslo“ pošle e-mailem vaše původní heslo, ukládá ho v čitelné podobě. Nepoužívejte tam heslo, které máte i jinde.
Hash
Místo hesla si server uloží jeho hash (otisk). Ten spočítá hashovací funkce: z libovolně dlouhého vstupu vyrobí řetězec pevné délky. Funkce SHA-256 třeba vždycky vrátí 64 znaků v šestnáctkové soustavě:
heslo123 → b4240791ce0be7b92ddd5091ae67234e5dff778e786dc0a3cb9846af0cf8b653
heslo124 → ???Druhý řádek schválně nevyplňujeme, spočítáte si ho ve cvičení.
Hash si můžeme představit jako otisk prstu. Podle otisku poznáme, jestli patří konkrétnímu člověku, ale člověka z něj nesestavíme. U hashovací funkce platí tři věci:
- Stejný vstup dá vždycky stejný hash. Server proto spočítá hash z hesla, které zadáte při přihlášení, a porovná ho s uloženým.
- Z hashe se heslo zpátky spočítat nedá, funkce funguje jen jedním směrem.
- Když se ve vstupu změní jediný znak, změní se výrazně celý hash.
Hash si nepleťme se šifrováním z lekce o zabezpečení. Zašifrovanou zprávu jde klíčem zase rozšifrovat. K hashi žádný klíč neexistuje.
Sůl
Samotný hash ale nestačí. Stejné heslo dá vždycky stejný hash, takže si útočník může předem spočítat hashe milionů běžných hesel a potom jen hledat shody v této tzv. předpočítané tabulce. V uniklé databázi navíc hned vidí, kteří uživatelé mají stejné heslo.
Proto server přidá ke každému heslu sůl (salt), tedy náhodný řetězec, který je pro každého uživatele jiný. Hashuje se heslo spojené se solí a sůl se uloží vedle hashe.
Sůl není tajná, stačí, že je u každého jiná. Útočník pak musí hádat heslo každého uživatele zvlášť.
Pomalá funkce
SHA-256 je navržená tak, aby byla rychlá. Při kontrole stažených souborů je to výhoda, u hesel spíš vada, protože rychle může hádat i útočník. Na hesla se proto používají funkce, které jsou pomalé schválně, třeba bcrypt nebo Argon2. Uživatel zlomek sekundy při přihlášení nepostřehne. Útočník, který zkouší miliardy hesel, ale hádá zhruba milionkrát pomaleji.