Nic z textu mi nevysvětluje, proč by používání e-mailu jako loginu měla být potíž.
Nevnímavost vůči upozornění HTTPS? Potíž.
Slabá hesla? Potíž.
Opakování hesel? Potíž.
Nevnímavost vůči tomu, kam to heslo píšu? Potíž.
Ale v samotném konceptu využití e-mailu jako identifikátoru nevidím sebemenší problém (jiný než ten, že ten e-mail musím "prozradit", což ale v drtivé většině stejně udělat plus mínus musím).
Pokud, pane Dočekale, trváte na tom, že je to potíž, zkuste mi to vysvětlit. Například jako budoucímu vývojáři nové webové aplikace?
Za ty inkrementace čísel na konci hesla ale často mohou dementní omezení na hesla. Teď jsem si zakládal účet u nejmenovaného zlého platebního systému:
Délka hesla max. 20 znaků (WTF?).
Žádné mezery (navíc to sdělí až ex post, nikoliv při prvním zadávání hesla).
Požadavek na čísla a jiné symboly (které samozřejmě většina lidí prostě nafláká nakonec).
Takže je v podstatě nereálné mít unikátní, silné a zapamatovatelné heslo. Krásně to popisuje Randall Munroe:
Obavam se, ze to je velmi naivni predstava. To nebude fungovat ani na webech ceskych tvurcu, natoz na webech zahranicnich. Drtiva vetsina webu dokonce neumoznuje pouzivat nic jineho, nez alfanumericke znaky ASCII. A stav se spise zhorsuje - opakovane jsem musel na ruznych webech menit generatorova hesla, protoze provozovatel web "vylepsil" a me puvodni heslo neslo pouzit.
Ano, je to tak. Napsal jsem HTTP Digest, protože je to protokol, který už je ve standardu dlouho (i když není povinný), a je implementován ve spoustě klientů i serverů. A proti dnešku by to bylo podstatné zlepšení.
Odolný proti krádeži údajů ze serveru by měl být třeba SCRAM, ale přesný princip fungování jsem zatím nezkoumal.
Uživatel zadá své heslo, k tomu se připojí pojmenování serveru a z toho vytvoří prohlížeč hash. Ten pošle serveru a server si tenhle hash uloží. Tedy mělo by to tak být, pokud by se registrace standardizovala. Dál už by to bylo současné HTTP Digest. Server pošle výzvu (náhodný text). Prohlížeč se uživatele zeptá na heslo, připojí pojmenování serveru, vytvoří hash (pokud uživatel zadal správné heslo, je to ten samý hash, který má uložen server). K tomuto hashi prohlížeč přidá výzvu serveru a vytvoří druhý hash, který odešle serveru. Server zná první hash i výzvu, spočítá druhý hash a porovná jej s tím, který dostal od uživatele. Tj. uživatel zadává jen heslo, díky prvnímu hashi, který obsahuje i pojmenování serveru, se nedá znalost jednoho hashe použít pro přihlášení na jiný server, i když má uživatel stejné heslo. Díky té výzvě a druhému hashi není možné použít replay attack – i když někdo odposlechne druhý hash poslaný po síti, nemůže jej použít, protože příště pošle server jinou výzvu.
Když uživatel používá více prohlížečů, prostě jen do prohlížeče zadá svoje heslo. Prohlížeč si nemusí nic pamatovat, pojmenování serveru a výzvu dostane od serveru, heslo zadá uživatel. Proto je to právě jednodušší na použití, než správce hesel, protože nepotřebujete nic nikam ukládat, stačí jenom prohlížeč.
Jasně, odhlášení je další věc, která ve standardu chybí. Psal jsem to už někdy dříve, nechtěl jsem to tentokrát celé opakovat. Základní věc je tlačítko pro odhlášení přímo v prohlížeči, na tom není co řešit, to se dá implementovat hned teď, a bylo by to užitečné. Další věc je, aby se o odhlášení aplikace dozvěděla a aby se dalo vyvolat u webové stránky – ale to už jsou takové třešničky na dortu.
HTTP Digest je proti MitM útoků odolná, na rozdíl třeba od session řešené přes cookie.
Masově se nepoužívá z několika důvodů. Implementace přihlašování v prohlížečích byla dlouho z pohledu UX příšerná, dnes už je to o něco lepší. HTTP Basic je nebezpečnější, než přihlášení přes formulář, protože se heslo posílá v otevřeném tvaru s každým požadavkem (při přihlášení přes formulář se pošle jen jednou na začátku session). No a implementace HTTP Digest nebyla povinná a byly problémy s kompatibilitou mezi klienty a servery (přitom je to tak jednoduchý standard). No a ta absence odhlášení v prohlížečích je také dost problém, navíc je to dost nepochopitelné.
Součástí formuláře pro přihlášení musí být webová adresa, tím pádem je to naopak odolné vůči útokům přes různé překrývání formulářů a iframy – uživatel vždy vidí skutečnou adresu, ke které se přihlašuje. Rozlišení Digest vs. Basic je opět na prohlížeči – jak jsem psal, měl by uživatele varovat, pokud se heslo posílá v otevřeném tvaru.
> A jak chcete zajistit, že nějaký hash patří zrovna tomuto uživateli?
Byl to překlep a mělo tam být „zjistit“? (jinak tomu nerozumím) Z toho protokolu prostě vypadne „ano“/„ne“.
> Jak chcete zajistit, že tento hash nepoužije někdo jiný?
Tím, že pokaždé generuju jinou challenge. Takže ten hash použít může, ale bude mu úplně k ničemu.
> A jak se řeší situace, kdy jeden uživatel používá službu na více prohlížečích (doma u PC, na cestách v notebooku apod)?
V čem by měl být problém? Uživatel prostě zadá svoje jméno a heslo a o nic se nestará.
> Jenže problém je, že aplikace nad nim nemá plnou kontrolu. Tudíž nemůže plně důvěřovat datům, které dostane. Ostatně největší problém tohoto typu autentizace je náchylnost na man-in-the-middle attack.
To si nějak nedokážu představit, můžeš to rozvést? Jak se liší MITM nad form+cookies „přihlašováním“ a nad HTTP auth?
> A když jsem psal, že aplikace nemá plnou kontrolu, tak jedním z nich představuje odhlašování.
Ano, to je myslím ten problém, o kterém Filip občas píše - prohlížeče neimplementují funkci „odhlásit“. Existují hnusné hacky jako že klientovi pošleš 403 a revokuješ mu pomocnou cookie, ale to je humus. Prostě ve Firefoxu mi schází tlačítko „logout“ (jde to jen globálně přes Odstranit citlivá data → Active Logins).
> Phishing lze provést i na něm.
Phishing lze provést tak nějak z principu úplně vždycky… Stejně, jako MITM.
> Takže na první pohled uživatel nepozná kdo ho volá
URL?
Přijde mi, že jako "národ" máme (jako pár dalších) určité unikum v tom, že můžeme používat v rámci hesla "ř" - nebo lépe Ř.. troufám si tvrdit, že takový znak jen málokterý hacker zahrne do svých brute force attacků.. resp. pokud nepoužívá (jako že asi nebude) kompletní Unicode table na svém počítači, tak se mu ani korektně nezobrazí.. ale to je jen taková úvaha :)
HTTP autentizace je v tomto přijatelná. Jenže problém je, že aplikace nad nim nemá plnou kontrolu. Tudíž nemůže plně důvěřovat datům, které dostane. Ostatně největší problém tohoto typu autentizace je náchylnost na man-in-the-middle attack.
A když jsem psal, že aplikace nemá plnou kontrolu, tak jedním z nich představuje odhlašování. Toto je naprosto mizerně implementováno. Jasně stačí ukončit prohlížeč. Ale tak snadné to není. V dnešní době tabů, je problém ukončit prohlížeč, když jsou v prohlížeči otevřeny další stránky. A co v případě, že se chci odhlásit a přihlásit se pod jiným účtem? Existuji metody jak dosáhnout odhlášení nebo přelogování, ale jsou to jen finty a ne plnohodnotné operace.
Kdyby HTTP autentizace byla bezpečná, tak proč se masově nepoužívá?
Když tak přemýšlím, tak i HTTP autentizace není žádná sláva. Phishing lze provést i na něm. A mám pocit, že až moc snadno. Za prvé formulář pro přihlášení je za všech okolností identický, protože ho volá prohlížeč. Takže na první pohled uživatel nepozná kdo ho volá, nehledě na to, že požadavek může přijít ještě před načtením stránky, tudíž chybí grafická kontrola. Za druhé. Co brání útočníkovi místo digest použít basic? Uživatel nic nepozná (hlavičky nevidí) a prohlížeč na to neupozorní, pokud tam neimplementuji hlášku, že posílá heslo v plain textu. Takže uživatel nevědomky nepošle hash, ale jméno a heslo.
Heslo napsané na monitoru nebo v peněžence prakticky nevadí. Spousta uživatelů pochopí, že heslo se v prohlížeči píše jen do toho jediného dialogového okna, stejně jako spousta uživatelů už dnes chápe, že heslo má být složité. Dost uživatelů chápe i to, že nemají při registraci zadávat e-mail a heslo, které je stejné, jako heslo k tomu e-mailu. Akorát to těm uživatelům nikdo neřekl.
Systém, kdy vyzrazení jednoho hesla znamená kompromitaci všech služeb, je i password manager. Pochybuju o tom, že si pamatujete stovky hesel, takže nějaké sdružování pod jedno nebo několik hesel taky používáte. V tom vám nic nebrání. Jde jenom o to, aby provozovatel služby vaše heslo (ani jeho ekvivalent použitelný jinde) vůbec neznal.
HTTP Digest se občas používá, ale bohužel málo. Pokud máte něco lepšího, co by se hodilo pro použití na veřejném webu, sem s tím.
1) BFU nebude mít nikdy složité heslo
2) pokud bude, bude ho mít někde napsané, ideálně na monitoru, v peněžence a v poznámkách na home v mobilu
3) uživatel heslo zadá kamkoliv bez ohledu na varovné hlášky, protože on ten obrázek prostě chce vidět
4) vůbec se mi nelíbí systém, kde vyzrazení jednoho hesla znamená kompromitaci naprosto všech mých služeb
5) co jsem rychle koukl na HTTP Diggest na wiki tak doufám, že to nikde nasazovat nebudou a vyhnije to
Zatím se mi nepodařilo žádného člověka přesvědčit na správce hesel - tedy ano, ale dlouhodobě nevydržel nikdo (já mám keepass přes 8 let s 1000 hesly). Nikdo z běžných lidí nemá složitá hesla, nepamatoval by si je, z toho stejného důvodu nemají ani hesel více (nebo více jak 3). Pokud nějaká služba vyžaduje pravidelnou změnu hesla, je to konečná a řeší to zvyšujícím se číslem na konci nebo papírkem na monitoru. Ze stejného důvodu je silně problematické požadovat login jiný než email, lidi to nejsou schopni vymýšlet a spravovat.
Potkal jsem dokonce i dost těch, kteří vůbec nevědí, že když po nich služba chce email a heslo, že mohou (měli by) zadat jiné heslo než do toho mailu, že to spolu nesouvisí.
Prostě BFU je z pohledu IT lidí "zařízení" poměrně jednoduché a předpokládat nějaké rozumné nakládání s přihlašovacími údaji je dost naivní. Proto těch problémů a úniků rozhodně ubývat nebude.