Pro symetrické šifrování potřebuješ klíč dlouhý tak jak je dlouhý klíč symetrické šifry, typicky tedy 128 nebo 256 bitů. Ale uživatel zadává heslo. Naivní způsob heslo doplnit nulama (nebo naopak oříznout pokud je delší než 128 bitů = 16 znaků) není moc dobrý protože se lidem líbí když klíče jsou „náhodné“ a přímo do AESu nevstupuje jako klíč něco co má moc nul a opakující se hodnoty.
První věc co se s tím dá udělat je heslo zahashovat a jako klíč použít výsledek.
Standardní kryptografické hashovací funkce jako třeba SHA-256 jsou „rychlé“, takže když někdo dostane zašifrovaný soubor, může hesla hádat podle slovníku nebo i hrubou silou a je to rychlé a snadno paralelizovatelné.
Proto se začalo dělat to, že se hashovací funkce aplikuje hodněkrát po sobě. Například SHA256(SHA256(SHA256(SHA256(heslo)))) (v praxi tam asi bude ještě nějaký mezikrok kdy se výsledek nějak zpracovává). Těch opakování je, třeba v případě ze zprávičky, 100k, 350k, nebo 600k. Abys získal z hesla klíč pro symetrickou šifru a mohl zkusit soubor rozšifrovat (nebo nějak jinak ověřit že heslo bylo správné), musíš tak provést tu „rychlou“ hashovací funkci mnohotisíckrát, a tak si nemůžeš dovolit hesla zkoušet příliš rychle.
Nicméně tyto funkce jako SHA-256 mají ještě jednu „vadu“, stačí jim málo paměti a používají ji tak, že se to snadno paralelizuje na GPU. V praxi je pak zkoušení hesel na GPU o dost rychlejší než „legitimní“ používání na CPU (kde si pak nemůžeme dovolit nastavit víc než třeba milion iterací, protože by pak rozšifrování souboru trvalo hrozně dlouho). Proto existují speciální funkce, například Argon2, což jsou „hashovací funkce“ navržené aby nešly moc dobře počítat paralelně, typicky tak, že potřebují hodně paměti (takže se na GPU nevejde příliš mnoho paralelních instancí) a náhodně do ní přistupují (takže se propustnost paměti zabije na tom že to nejde cachovat).
Já bych ten první důvod nepodceňoval. SHA-[123] jsou výsledkem soutěže NSA, už v rámci výběru se ty algoritmy prověřují. Argon2 je alespoň výsledek komunitní soutěže, takže se mu snad do nějaké míry věřit dá, i když není zdaleka tak prověřená, jako SHA. PBKDF2 je podle mne jenom přidání iterací s vírou „co by se mohlo stát špatného“, mám silné pochybnosti o tom, zda to někdy vůbec někdo kryptograficky seriozně zkoumal.
Třetí důvod pak má zajímavé důsledky v praxi. Pak vám někdo vykládá, jak zjistili, že je to pomalé a uživatelé si stěžují, tak na to mají mašiny v cloudu, které to hashují a škálují je podle počtu uživatelů, kteří se přihlašují. No a proč by to nemohl úplně stejně na víc počítačů v cloudu rozdistribuovat útočník?