Funkce pro odvození klíče

Funkce pro odvození klíče (anglicky Key derivation function, odtud zkratka KDF) je v kryptografii označení funkce, která odvozuje (vytvoří) jeden nebo více šifrovacích klíčů z nějakého tajemství (hlavní klíč, heslo, heslová fráze), typicky za použití kryptografické hašovací funkce (obecně lze použít jakýkoliv generátor pseudonáhodných čísel). KDF zajišťuje kryptografickou bezpečnost odvození klíče.

KDF je často použita, ve spojení s veřejnými parametry, k odvození jednoho nebo více klíčů ze společných tajných hodnot (někdy označováno jako „diverzifikace klíčů“, anglicky key diversification). Takové použití může zabránit útočníkovi, který získal odvozený klíč, zjistit užitečné informace buď o vstupní tajné hodnotě nebo o kterémkoli odvozeném klíči. KDF může být také použita k zajištění toho, aby odvozené klíče měly požadované vlastnosti, například mohou být vyloučeny slabé klíče v některých specifických šifrovacích systémech.

Funkce pro odvození klíče jsou často používány jako součásti v tzv. pluralitních key-agreement protokolech. Příkladem takové funkce pro odvozování klíčů je KDF1, která je definovaná v IEEE Std 1363-2000, a podobné funkce v ANSI X9.42.

Funkce pro odvození klíče je používána pro odvození klíče ze známého tajemství. Je-li například potřeba předsdílený klíč (anglicky pre-shared key), používá se často heslová fráze, ze které je šifrovací klíč generován právě pomocí funkce pro odvození klíče. Odvozený klíč je pak možné použít pro symetrickou šifru.

Funkce pro odvození klíče slouží společně s kryptografickou solí k bezpečnému uložení hesel na pevném disku počítače, protože pak z uloženého tvaru nelze zpětně získat hesla pomocí slovníkového útoku nebo pomocí duhové tabulky.

Natažení klíčů (key stretching)

[editovat | editovat zdroj]

Funkce pro odvození klíčů jsou také použity v aplikacích k odvození klíčů z tajných hesel a heslových frází, které obvykle nemají takové požadované vlastnosti aby byly použity přímo jako šifrovací klíč. V takových aplikacích se obecně doporučuje, aby funkce pro odvození klíčů byly záměrně pomalé a tím znemožnily útok hrubou silou nebo slovníkový útok na vstupní hodnotu hesla nebo přístupového hesla.

Takové použití může být vyjádřeno jako , kde je Odvozený Klíč, je funkce pro odvození klíče, je originální klíč nebo heslo, je náhodné číslo které slouží jako kryptografická sůl a vyjadřuje počet opakování (iterací) sub-funkce. Odvozený klíč je použit namísto původního klíče nebo hesla jako klíč do systému. Hodnoty Soli a počtu iterací (pokud není tento počet stanoven pevně) jsou uloženy spolu s hašem hesla nebo poslány jako prostý text se zašifrovanou zprávou.

Obtížnost útoku hrubou silou se zvyšuje s počtem iterací. Praktickým limitem počtu iterací je neochota uživatelů tolerovat znatelné zpoždění při přihlášení k počítači nebo doba zobrazení zprávy o dešifrování zprávy. Použití soli brání útočníkům v použití před počítaných slovníků odvozených klíčů.

Alternativním přístupem je tzv. posilování klíče (anglicky key strengthening). Takováto funkce rozšiřuje klíč o náhodnou sůl, ale potom (na rozdíl od „natažení“ klíče) sůl bezpečně maže. To nutí jak útočníka tak i legitimního uživatele provádět hledání hodnoty soli hrubou silou.[1] Ačkoliv pojednání které představuje funkci „natahování“ klíčů[2] odkazuje na dřívější metodu (posilování klíčů) a záměrně bylo zvoleno jiné jméno, je výraz „posilování klíčů“ často (pravděpodobně nesprávně) spojován s výrazem „natahování“ klíčů.

První záměrně pomalou (klíč „natahující“) funkcí pro odvození klíče založenou na bázi hesla byla funkce nazývaná „crypt“ (nebo „crypt(3)“ podle její manuálové stránky). Tuto funkci vynalezl Robert Morris v roce 1978 k zašifrování Unixových hesel.[3] I když to byl v té době velký pokrok, zvyšující se rychlosti procesorů od dob PDP-11 zapříčinily proveditelnost útoku hrubou silou proti šifře crypt a neadekvátnost 12bitové soli. Návrh funkce crypt také omezoval délku hesla pouze na 8 znaků, což znemožnilo používání silných hesel.

Moderní heslově-založené funkce na odvození hesel, jako je PBKDF2 (specifikovaná v RFC 2898), používá kryptografický hash, jako je MD5 nebo SHA1, více soli (např. 64 bitů) a vysoký počet iterací (často 1000 a více). Objevily se návrhy aby byly použity algoritmy, které vyžadují velké množství paměti a jiných počítačových zdrojů, aby byly útoky více náročné (konkrétně custom hardware attacks). Jedním konkrétním příkladem takovéhoto algoritmu je funkce scrypt(), založená na koncepci sekvenčních funkcích s pevnou pamětí,[4] které jsou použity pro dodatečné zabezpečení soukromých klíčů a přístupových hesel.

V tomto článku byl použit překlad textu z článku Key derivation function na anglické Wikipedii.

  1. U. Manber, "A Simple Scheme to Make Passwords Based on One-Way Functions Much Harder to Crack," Computers & Security, v.15, n.2, 1996, pp.171-176.
  2. Secure Applications of Low-Entropy Keys, J. Kelsey, B. Schneier, C. Hall, and D. Wagner (1997)
  3. Morris, Robert; Thompson, Ken. Password Security: A Case History. [online]. 1978-04-03 [cit. 2011-05-09]. Dostupné v archivu pořízeném dne 2003-03-22. 
  4. http://www.tarsnap.com/scrypt/