V nedávné době došlo k několika problémům s ukládáním hesel u služeb, které velmi dbají na bezpečnost svých uživatelů a hesla se snaží ukládat správně. GitHub si omylem ukládal čitelná hesla do logu při jejich resetu, Twitter dokonce u všech uživatelů. Uživatelé jsou zároveň nepoučitelní a jedno heslo používají na více různých službách. Např. GitHub se opakovaně stal obětí tohoto nešvaru, jednou dokonce ve velkém rozsahu. Útočníci prostě heslo uniklé z jiné služby zkusili použít i na GitHubu a u některých uživatelů to prošlo. Aby se to nestalo vám, je vhodné dát uživatelům možnost použít jednorázové heslo.
Jak se nestat tím, od koho hesla uniknou a útočníci je pak použijí i jinde? V první řadě samozřejmě používáním HTTPS a správným ukládáním hesel na serveru, v PHP funkcí password_hash. Jak jsme ale viděli u GitHubu a Twitteru, samo o sobě to nestačí. Stačí malá nepozornost, přidání nějakého „neškodného“ logování a hesla se najednou válí na serveru i v čitelné podobě. Navíc i pokud máme aplikaci neprůstřelnou, tak se k heslům může dostat jakýkoliv zaměstnanec s přístupem k webovému serveru, který vidí hesla ještě před jejich bezpečným uložením nebo ověřením.
Řešením je hesla hašovat už na klientu, takže se v čitelné podobě na server vůbec nedostanou. Na klientu spočteme hash_client(password)
, na serveru uložíme hash_server(hash_client(password))
. hash_client
a hash_server
jsou nějaké hašovací funkce, klidně ta stejná. Pokud má klient vypnutý JavaScript, tak na server pošleme samotné heslo a obě hašování provedeme na serveru. Je důležité si uvědomit, že toto opatření nezlepší bezpečnost našeho samotného serveru. Pokud by se útočník dostal k hodnotě hash_client(password)
(ať už odposlechem nebo třeba z logu na serveru), tak ji prostě příště použije znovu. S touto hodnotou je proto potřeba zacházet stejně obezřetně jako s heslem samotným. Důležitou výhodou ale je, že tato hodnota mu bude k ničemu na jiných službách.
Další výhodu spatřuji v tom, že uživatelé si mohou sami ověřit, jak služba s jejich heslem nakládá. Michal Špaček shromažďuje informace o tom, jak služby ukládají hesla, jediným vstupem pro tuto službu je ale vyjádření služeb samotných (krom nejkřiklavějších případů, kdy nám služba např. zapomenuté heslo prostě pošle tak, jak jsme ho zadali). GitHub i Twitter mají obě nejlepší hodnocení, přestože obě podle vlastního vyjádření hesla ukládala i v čitelné podobě (byť omylem).
Věřím, že stejně jako služby začaly hesla postupně ukládat bezpečně, tak je taky začnou přenášet bezpečně, protože jim do mého hesla konec konců nic není. Ověření síly hesla (k čemuž jedině služby heslo potřebují, navíc jen při registraci) se může dělat také na klientu.
Diskuse je zrušena z důvodu spamu.