Kryptografická sůl je v šifrování několik náhodných bitů, které slouží jako doplňující vstup při použití jednosměrné funkce, kde umožňuje, aby její výstup měl mnoho možných variant. Používá se typicky pro ukládání zakódovaného tvaru hesel, protože díky této „soli“ bude mít stejné heslo různý zakódovaný tvar a nebude z něj možné získat pomocí slovníkového útoku zpětně původní heslo a nelze použít ani tzv. duhovou tabulku, protože by byla moc velká.
Popis
Jednosměrná funkce k sobě nemá inverzní funkci, takže zakódujeme-li pomocí ní třeba heslo, získáme číslo, ze kterého nelze původní heslo snadno zpětně odvodit. Typickou jednosměrnou funkcí je kryptografická hašovací funkce (např. MD5, SHA). Když je potřeba uživatele počítače autentizovat, je jím zadané heslo zakódováno stejným algoritmem (stejnou hašovací funkcí) a výsledek je porovnán s uloženým tvarem. V případě shody je zadané heslo správné.
Pokud by heslo bylo v počítači uloženo jako prostý text, může ho kdokoliv s administrátorskými právy snadno přečíst a zneužít. Pokud je heslo uloženo jako hash, není přímo čitelné, ale pomocí slovníkového útoku, případně pomocí duhové tabulky lze opět poměrně snadno získat původní heslo i přes to, že pro jeho zakódování byla použita jednosměrná funkce.
Sůl umožňuje vytvořit situaci, kdy jeden vstup (např. zmíněné heslo) může mít při použití stejné jednosměrné (hašovací) funkce mnoho různých výstupů (v podstatě tolik, kolik různých kombinací soli můžeme získat). Protože je sůl volena náhodně, budou při opakovaném použití stejné jednosměrné funkce vznikat různé zakódované tvary. Zvolí-li tedy dva uživatelé stejné heslo, bude zakódovaný tvar různý (s pravděpodobností náhodné volby stejné hodnoty soli). Díky tomu nebude možné použít duhovou tabulku, protože by byla kvůli soli příliš velká (každé heslo by v ní muselo mít tolik zakódovaných tvarů, kolik je možností soli).
Pokud je sůl do zakódovaného tvaru uložena v otevřené podobě, je stále možné použít slovníkový útok (tato možnost je rutinně používána, například v unixové funkci crypt(3)). Proto je někdy sůl ze zakódovaného tvaru odstraněna, takže při zadání hesla je nutné vyzkoušet všechny možné kombinace soli. To může být časově náročné, avšak případný útočník by musel použít stejnou metodu, což by ho neúměrně zdrželo, takže v tomto případě sůl slovníkový útok prakticky znemožňuje (činí ho velmi obtížným podle počtu možných kombinací soli).
Postup použití soli
Nová sůl je generována náhodně pro každé heslo. Se vstupem se typicky zkombinuje pomocí odvozovací funkce pro klíče (anglicky key derivation function). Ve zkratce tato funkce umožní (za pomoci kryptografické hašovací funkce) odvodit šifrovací klíč ze zadaných přihlašovacích údajů uživatele (hesla). Vytvořený klíč je poté určitou metodou přiřazen k danému heslu. Na výsledek je standardně aplikována znovu kryptografická hašovací funkce (např. MD5, SHA) a tím je vytvořená cílová šifra. Zprvu vygenerovaná hodnota soli může být poté k cílovému tvaru šifry přidána (čímž však stále umožňuje útočníkovi použít slovníkový útok), nebo může být zahozena (viz výše). Následně je šifra uložena do databáze.
Implementace
Šifrovací soli jsou v současnosti široce používány v mnoha moderních počítačových systémech například v Unixových systémech a pro internetovou bezpečnost.
Implementace solí v Unixu
Starší verze Unixu (stejně jako ty nové) užívaly heslový soubor k ukládání hashů a osolených hesel (hesel s předponou dvouznakových náhodných solí). Sůl byla v souboru ukládána také (v obyčejné textové podobě). Tento heslový soubor mohl číst kdokoliv, kdo byl uživatelem systému. Bylo to nezbytné aby mohly uživatelsky privilegované softwarové nástroje najít uživatelská jména a další informace (z toho důvodu bylo a je zabezpečení hesel realizováno pomocí jednosměrných funkcí). Starší implementace Unixu omezovaly heslo na 8 znaků a používaly 12bitové soli, což umožňovalo 4096 možných hodnot soli dostatečných pro požadavky úložných databází v 70. letech 20. století.
V současné době se používá tzv. systém stínových hesel (anglicky shadow password system) pro omezení přístupu k hashům a solím uvnitř heslového souboru. Sůl je tvořena 8 znaky, hash má 86 znaků a délka hesla není limitována.
Implementace solí ve webových aplikacích
Dnes je pro webové aplikace běžné ukládání hashových hodnot uživatelova hesla v databázi. Bez kryptografické soli je velice lehké zjistit prolomitelná hesla pomocí zdařilých SQL útoků (SQL injection). Mnoho uživatelů také používá stejné heslo pro různé webové stránky, a proto je užití soli velmi důležitou součástí celkové bezpečnosti webových aplikací.
Související články