@anonym:
Pokud se rozhodnete řešit na webu autentizaci pomocí hesel, tak byste měl řešit následující problémy:
1) Čitelnost hesel v databázi
Pokud unikne databáze, uživatele nepotěší, že si útočník jejich hesla rovnou přečte. Hashovací funkce se používají proto, aby čitelná podoba hesla (kterou je třeba dát serveru pro přihlášení) nebyla z databáze zjistitelná. Je dobré zvolit nějakou hashovací funkci považovanou dnes za bezpečnou (naptř. z rodiny SHA-2, tedy SHA224/256/384/512).
Princip je takový, že server přijaté heslo zahashuje a výsledek porovná s tím, co má uložené v databázi.
2) "duhové" tabulky (rainbow tables)
Problém je, že si každý může hashe pro různá hesla předpočítat dopředu, vytvořit si jakousi tabulku dvojic (hash,heslo), tedy vlastně funkci "inverzní" k hashovací. Tím se zahashované heslo uživatele stává čitelné, jakmile se objeví v takové "duhové" tabulce, a tedy jsme v zásadě na začátku (nelze spoléhat, že si uživatelé budou volit hesla, která v předpočítané tabulce nikdy nebudou). A ano, takových tabulek předpočítaných dvojic (hash,heslo) lze najít hromadu, stačí mít jen dostatek diskového prostoru.
Pro vyřešení tohoto problému byla zavedena sůl (salt), tedy náhodně vypadající řetězec (generovaný ideálně náhodně), který se k heslu před hashováním přidá. To znamená, že útočník si nemůže dopředu předpočítat "duhovou" tabulku, protože pro výpočet hashe potřebuje znát sůl.
Další výhoda použití soli spočívá v tom, že uživatelé se stejným heslem budou mít rozdílný hash (pokud budou mít rozdílnou sůl).
Sůl není tajný parametr, takže ji můžete ukládat klidně v databázi. Jen to jen věc přidávající na náhodnosti. Měla by být ale dostatečně náhodná.
3) Vysoký výkon počítačů
I když útočník nemůže využít (díky soli) nějaké již hotové "duhové" tabulky, stále může po nahlédnutí do databáze použít hrubou sílu a pro dvojici (salt, hash) najít vstupní heslo. Samozřejmě za předpokladu, že zná algoritmus hashování a aplikace soli, ale utajování těchto věcí je proti principům dnešní kryptografie (tajné jsou klíče/hesla, ne postupy).
Řešení tohoto problému je v celku přímočaré; použít hashovací funkci, jejíž výpočet trvá velmi velmi dlouho. Uživatel její výpočet pocítí pouze při přihlášení, takže nárůst náročnosti pro něj nepředstavuje problém, i kdyby ten výpočet trval vteřinu. Nejjednodušším způsob, jak zvýšit výpočetní náročnost hashovací funkce, je její iterativní použití (tzn. ji na výsledek používat opakovaně). Stačí jen zvolit vhodný počet iterací (tisíce-statisíce nebudou problém).
--------------
Tak, to bychom měli vhled do problematiky.
--------------
Weby nedělám, ale přijde mi, že v dnešní javascriptové době by se dalo autentizovat i pomocí privátních/veřejných klíčů. Privátní klíč by se mohl generovat z uživatelova jména, hesla (a bhůvíčeho) a mezi serverem a klientem by se pak vyměnila jenom challenge (náhodná data) a response (podpis challenge). Ale určitě už takové věci existují.