Jan Štráfelda - Průvodce online -projektem
Praha/Mělník  |  776 678 044  |  jan@strafelda.cz  |  Pošlete mi poptávku

Heslo

Heslo je řetězec tvořený písmeny, čísly a dalšími znaky, který slouží k autentizaci uživatele. Uživatel ho zadává do přihlašovacího formuláře společně s přihlašovacím jménem, tzv. loginem. Tím prokazuje svou identitu (potvrzuje, že je tím, za koho se vydává).

Podmínky bezpečného hesla

Aby heslo opravdu zajistilo bezpečný přístup, musí platit několik podmínek:

  1. Heslo musí být tajné

    Uživatel musí své heslo udržet v tajnosti. Pokud si ho napíšete na papírek do peněženky, nebo snad dokonce nalepíte na monitor, tuto podmínku nesplňujete. Stejně, jako když hesla schraňujete jakýmkoliv nezabezpečeným způsobem (třeba v textovém souboru na ploše počítače – zdánlivě zabezpečeného heslem, než se ovšem rozbije a dáte ho do servisu úplně cizím lidem).

  2. Heslo musí být unikátní

    Z předchozí podmínky také vyplývá, že potřebujete mít heslo unikátní pro každou aplikaci, web či e-shop, protože jinak ho zná provozovatel dané služby (a tedy i všichni jeho programátoři, správci serveru apod.). A heslo již není tajné.

    Z dané služby také může heslo snadno uniknout, stává se to zcela běžně. Můžete zkusit zadat svůj e-mail na webu HaveIBeenPwned.com – vypíše vám, v kolika databázích uniklých hesel se váš e-mail nachází. Jsou to docela děsivá čísla. A v každém z těchto úniků mohli útočníci zjistit vaše heslo k dané službě.

  3. Heslo musí být obtížně zjistitelné

    Heslo musí mít takové vlastnosti, že pro potenciální útočníky nebude možné ho uhodnout (jméno vašeho psa tedy nebude fungovat). Nemělo by také mít žádnou logiku, kterou by bylo možné odvodit ze znalosti jiných vašich hesel (typu jméno služby + rok vašeho narození). Či jakékoliv jiné znalosti o vás (jména dětí).

  4. Heslo musí být dostatečně dlouhé

    Aby nebylo možné heslo získat hrubou silou, tj. postupným zkoušením všech kombinací znaků, musí být také dostatečně dlouhé. S tím, jak roste výpočetní síla počítačů, minimální délka se stále prodlužuje. Dnes se tuším doporučuje délka alespoň dvanácti znaků (absolutní minimum je 8).

  5. Heslo musí být složené z různých znaků

    Pokud použijeme pouze malá písmena abecedy, u čyřpísmenného hesla nám to dává pouhých 457 tisíc kombinací. Malá a velká písmena už ale dávají 7,3 milionu kombinací. Malá a velká písmena s čísly pak 14,8 milionu kombinací. A přidání speciálních znaků, jako například ?!*-+.,#$@%& apod., už nás pak dostane na desítky milionů kombinací. Stále už čtyřpísmenného hesla. U osmipísmenného hesla je pak rozdíl 208 miliard při použití samotných malých písmen vs. 53 bilionů kombinací.

Zjištění úniků hesla na HaveIBeenPwned.com

Na webu HaveIBeenPwned.com si jednoduše zadáte svůj e-mail a rychle zjistíte, zda se nachází v některém známém úniku hesel. A co je ještě lepší – služba vás zdarma upozorní, pokud se tak stane někdy v budoucnu.

Možnosti získání hesla útočníkem

Abychom lépe pochopili, proč jsou tato pravidla důležitá, zkusíme se na hesla podívat optikou hackera.

Přímé útoky na konkrétního uživatele

Pokud útočník stojí právě o vaše heslo, může ho zkusit:

  • Uhodnout na základě informací, které o vás ví (narozeniny vaše či vašich blízkých, staré telefonní číslo apod.). Nebo si je zjistí třeba na sociálních sítích.
  • Získat pomocí tzv. sociálního inženýrství, tj. pod nějakou záminkou z vás heslo vymámit (třeba vám zavolá a tváří se, že je pracovníkem dané služby). Nebo tak alespoň zjistí informace, které ho k heslu dovedou.
  • Získat formou phishingu, tj. pomocí podvodné stránky, která se tváří jako originální přihlašovací formulář. Nevšimnete si toho, zadáte tam své přihlašovací jméno a heslo a v tu chvíli už je zná útočník.
  • Odposlechnout – třeba kamerou namířenou na váš stůl, programem snímajícím stisknuté klávesy apod. Případně odchycením internetové komunkace, pokud web stále ještě nepoužívá zabezpečený protokol HTTPS.
  • Postupně automatizovaně zkoušet různé varianty hesel pro váš login na dané službě (což se ale moc nedělá, protože část služeb to již blokuje a u zbytku hrozí, že si toho někdo všimne).

Databáze uniklých hesel

Nejčastějším způsobem, jak se útočník dostane k vašemu heslu, již dnes bývá právě výše zmiňovaný únik z některé služby. Databáze uniklých hesel z různých webů a aplikací jsou pak běžně ke stažení na internetu. Pokud služba ukládá hesla do databáze tak, jak heslo zapíšete (plain text), má to útočník jednoduché. Má rovnou hotovo.

Proto obvykle weby a aplikace ukládají hesla převedená na tzv. hash, tj. proženou je jednosměrnou funkcí, která z nich vytvoří otisk o určité délce. Přičemž z otisku nelze zpět získat původní heslo, to je podstata hashování. Když se pak přihlašujete a vyplníte heslo do formuláře, aplikace heslo také zaheshuje a oba otisky porovná. Tak je zajištěno, že nikdo vaše heslo nemá nikde uložené, přitom se však můžete autentizovat. Více o této problematice píšu dále.

Crackování hesel

Řekněme, že máme k dispozici databázi s uživatelskými jmény a hashy hesel mnoha tisíců uživatelů a chceme z hashů získat ona hesla. Hashovací funkce je jednosměrná, tj. nelze z ní zpětně získat původní heslo. Můžeme si však vytvořit tzv. duhovou tabulku (angl. rainbow table), tj. pro všechny kombinace znaků spočítat hashe a ty pak porovnat s každým hashem z naší databáze. Pokud odpovídají, heslo sedí.

Ke crackování hesel se dnes používají hlavně výkonné grafické karty. Mají stovky až tisíce jader a zvládnou tak potřebné matematické operace mnohem rychleji než hlavní procesor počítače s několika jádry. Miliardy hashů spočítají během sekundy. A do jednoho počítače můžete zapojit takových karet několik. Podobné stroje si dnes můžete pronajmout online za pár dolarů na hodinu, třeba od Amazonu. Existují však i výkonné crackovací servery se stovkami takových grafických karet.

Druhy crackovacích útoků

Pokud útočník láme hesla podobným způsobem, má několik možností:

  • Hrubá síla –  postupné zkoušení všech možných kombinací. To už se moc nedělá,  používají se spíš různé techniky, které proces urychlují.
  • Slovníkový útok – útočník zkouší různé kombinace slov z předem připraveného seznamu (slovníku). Nemusí však jít pouze o slovník českých slov, ale třeba i o seznamy hesel, které už unikly někdy dříve.
  • Kombinace z různých seznamů – třeba jméno a příjmení, slovo ze slovníku a číslo, více spojených slov apod.
  • Aplikace pokročilejších principů, které vycházejí ze znalosti toho, jak lidé ve skutečnosti hesla vytváří (viz další kapitola).

Síla hesla

Jak hesla obvykle vytváříme

Když si vytváříme heslo a víme, že nemíme použít jen samotné slovo, většina z nás aplikuje několik z následujících jednoduchých pravidel. Takové postupy ale bezpečnost hesla nijak významně nezvyšují, protože je samozřejmě útočníci běžně znají – stačilo jim důkladněji analyzovat jednu větší databázi uniklých hesel. Patří k nim například:

  • necháme si nějaké defaultní heslo (admin, test, guest)
  • použijeme některé běžné slovo ze slovníků a něco k němu přidáme
  • spojíme dvě či tři krátká slova (a většinou je zapíšeme malými písmeny, nebo první písmeno každého slova napíšeme velkým písmenem)
  • pokud už použijeme velké písmeno, bude nejspíš na začátku hesla
  • pokud v hesle použijeme číslo, bude nejspíš přilepené na konci, bude dlouhé 1–4 číslice (a dost často to bude nějaký rok)
  • stejně tak speciálním znakem bude často vykřičník či otazník přilepený na konci
  • případně používáme leetspeak, nahrazování podobně vypadajícími znaky (o → 0, i → 1, z → 2, e → 3, a → 4, a → @)
  • tzv. procházka po klávesnici (například qwert, asdfg)
  • heslo zapíšeme pozadu (aksuraM)
  • slovo zdvojíme (kacerkacer)
  • často také v hesle používáme název dané služby (seznam)

Zdánlivě složité heslo „Prosim15Housek!“ je tedy vlastně poměrně jednoduché na prolomení, přestože se skládá z 15 znaků, obsahuje velká písmena, číslice a speciální znak. Ve skutečnosti však jde o jednoduchou kombinaci čtyř pojmů ze slovníků. Které navíc ani nejsou seřazené náhodně, ale s určitou logikou. A co teprve mnohem běžnější hesla jako „Fantomas12“ či „iloveyou“.

Skutečně bezpečná hesla

Generátor hesel LastPassTrivální generátor hesel ve správci LastPass. Obvykle platí, že pokud si heslo dokážete rychle zapamatovat, je většinou snadno zjistitelné. Jakmile obsahuje nějaký jednoduchý logický vzorec, není dostatečně bezpečné. A jestliže už ho někdy někdo použil, nachází se v některém slovníku vzniklém z databáze uniklých hesel a tedy ho lze velmi rychle zlomit.

Nejvyšší míru entropie mají pochopitelně náhodné řetězce znaků a právě ty jsou nejsilnějšími hesly. Ideálně, pokud je vytvoříme pomocí některého z generátorů hesel (protože my lidé ve skutečnosti neumíme nic dělat náhodně). A heslo musí být dostatečně dlouhé.

Správce hesel

Pro každou službu máte mít jiné heslo, všechna musí být dlouhá a náhodná, tedy nezapamatovatelná, přitom si je nesmíte napsat do žádného souboru v počítači… Značně protichůdné požadavky, že?

Řešením je správce hesel (angl. password manager), specializovaný program, který hesla uchovává důkladně zašifrovaná. Přihlásíte se do něj jedním svým superheslem, třeba nějakou dlouhou větou, kterou si snadno zapamatujete. A ve správci hesel si pak hesla můžete přečíst, nebo ještě lépe – integruje se vám do prohlížeče v počítači i na telefonu a hesla do patřičných políček formulářů už doplňuje sám.

Nejčastěji používaní správci hesel

  • 1Password – hodně doporučovaný správce hesel, placený, funguje jako online služba i offline, s lokální úschovou hesel na klíčence (ale musíte si je pak sami zálohovat a synchronizovat).
  • LastPass – dnes již také placený správce hesel, který běží v cloudu, funčkní, výborně integrovaný do prohlížeče v počítači a o trochu hůře i v telefonu, s určitými pochybnostmi o reputaci vlastnické firmy.
  • KeePassopen source správce hesel s menší funkčností než mají předchozí dva programy.

Další alternativy

Správců hesel existuje celá řada, bývají také součástí antivirových bezpečnostních balíčků (Eset, Avast…). Existují také správci hesel přímo v jednotlivých prohlížečích (které toho ale umí mnohem méně).

Vyplatí se také zvážit byznys či family varianty správců hesel, které umožňují sdílet hesla napříč firmou nebo rodinou (a zabezpečit tak hesla všem blízkým a na jedinou fakturu). V této souvislosti se mi velice líbí myšlenka, platit zaměstnancům správce hesel jako zaměstnanecký benefit – firmu to téměř nic nestojí, zaměstnanci jsou chráněni před průšvihem a s nimi jsou v bezpečí i firemní hesla a další přístupy. Jen je potřeba to umět prodat (zaměstnance ohledně práce s hesly vzdělat, což stejně chcete udělat).

Dvoufaktorová autentizace

Stejně jako internetové bankovnictví, i spousta dalších služeb, jako je třeba Facebook, Twitter, Google účty apod., už dnes umožňují tzv. dvoufaktorovou autentizaci (2FA). To znamená, že k přihlášení nestačí pouhá znalost loginu a hesla, ale musíte svou identitu potvrdit ještě dalším způsobem. Třeba pomocí SMS zprávy či softwarového klíče, který vám vygeneruje speciální aplikace v telefonu. Útočníkovi pak nestačí, že něco ví (vaše heslo), ale musí i něco mít (váš telefon).

Obecně se doporučuje dvoufaktorovou autentizaci používat u všech služeb, jejichž napadení pro vás může mít nepříjemné následky. A platí to i z pohledu majitele firmy, vyžadujte nastavení dvoufaktorové autentizace u svých zaměstnanců u všech kritických služeb (kam může patřit třeba přístup do redakčního systému či intranetu, na firemní profily na sociálních sítích, do Google Analytics či Google Ads apod.).

Nejčastější hesla v ČR

Jen pro zajímavost k výše popsanému, jak si v České republice stojíme s internetovou bezpečností. Často je za daným slovem ještě číslice.

Variace na slovo „heslo“

Když uživatele zrovna žádné heslo nenapadá…

  • heslo
  • hesloheslo
  • password
  • heslo123

Čísla

Číslo „123456“ je nejčastějším heslem i celosvětově.

  • 123456
  • 12345
  • 123456789
  • 111111
  • 666666
  • 123123

Jména

Lidé také používají zdrobněliny (lucinka, lukasek), nebo kombinace jména a příjmení.

  • martin
  • michal
  • tomas
  • pavel
  • lukas
  • honza
  • jirka
  • lucinka

Obecná slova

Někdy také oblíbené sporty, jako třeba „fotbal“ či „tenis“.

  • lopata
  • jahoda
  • princezna
  • milacek
  • maminka
  • slunicko
  • sparta
  • test

Další časté řetězce

Většinou odvozené z pohybu prstů po klávesnici počítače.

  • abc123
  • qwerty
  • qwert
  • fuckyou

Registrace do aplikace, vytvoření hesla

Jste-li běžným uživatelem a dočetli jste článek o heslech až sem, uctivě vám děkuji za pozornost Emotikon: úsměv Dál už číst nemusíte. Následují totiž již pouze poznámky určené pro vývojáře a provozovatele webů.

Políčko pro zadavání hesla

Pokud chcete po uživateli, aby si vytvořil nové heslo, nepoužívejte programátory oblíbený způsob pro ověření překlepu, dvě políčka pro zadání hesla za sebou. Z hlediska použitelnosti je to čirý nesmysl. Mnohem lepším řešením je přidat ikonku, jejíž proklik způsobí změnu typu políčka z hodnoty password na hodnotu text. Místo hvězdiček tak uživatel uvidí reálný text, který zadal.

Přijdete indikátor síly hesla

Ideálně něco ve stylu Zxcvbn, co reálně pracuje se slovníky, jako to dělají hackeři. Pomohou také stručné rady ve formě textu, jak si vytvořit bezpečné heslo.

Ošetřete autocomplete

Pokud políčko pro zadání hesla správně opatříte typem password (který zajistí vypsání hvězdiček místo textu), prohlížeč do něj uživatelům automaticky vyplní stávající uložené heslo. Takové chování zde samozřejmě nechceme, proto je potřeba přidat ještě atribut autocomplete s hodnotou new-password. Celý kód tak bude vypadat takto:

<input type="password" autocomplete="new-password">

Někteří správci hesel mohou díky tomuto atributu také automaticky nabídnout dialog pro vygenerování nového hesla.

Ověřte hesla

Po odeslání formuláře ověříme, že heslo splňuje naše zásady pro tvorbu hesel. Doporučuji zvážit minimálně:

  • minimální délku hesla (8, či lépe 12 znaků)
  • použití speciálního znaku (nejen na konci)
  • použití velkých písmen a číslic (uprostřed řetězce)
  • nepříjímat hesla na blacklistu, který naplníte například seznamem nejčastějších hesel z databází uniklých hesel

Ukládání hesla v aplikaci

Ukládání hesel v původní podobě

Nikdy neukládejte hesla v čisté podobě. Už jsme si řekli, proč není dobrý nápad ukládat hesla jako plain text. Protože už při návrhu aplikace je třeba počítat s tím, že nám mohou data uniknout. A chceme potenciálnímu útočníkovi co nejvíce ztížit, aby se k reálným heslům dostal. Proto hesla hashujeme.

Chráníme tím uživatele naší aplikace, kteří možná používají stejné heslo i do dalších služeb, k e-mailové schránce apod. Ale chráníme tím i sebe, neboť mezi potenciálně uniklá hesla patří i ta naše, hesla administrátorů a programátorů aplikace.

Hashování hesel

Dříve se při ukládání hesel používaly hashovací funkce MD5SHA-1, které však nejsou zcela bezpečené. Ale hlavně jsou velice rychlé. Proto se dnes doporučuje používat funkci bcrypt, jež využívá šifrovací algoritmus blowfish, zahrnuje v sobě kryptografickou sůl a hlavně je pomalá, resp. ji lze nastavit na několikanásobné opakování (říká se tomu cost). Bude-li chtít útočník vygenerovat hrubou silou hashe z náhodných kombinací znaků stejným způsobem jako my, bude to mít také pomalé – a při miliardách operací každá vteřina našeho zdržení při logování do aplikace znamená roky rozdílu pro útočníka při crackování hesel.

PHP se od verze 5.5.0 pro hashování hesel používá funkce password_hash, pro porovnávání hashů pak password_verify. Obě právě využívají funkci bcrypt.

Kryptografická sůl

Při hashování hesel je potřeba k nim přimíchávat tzv. salt, další řetězec unikátní pro každé heslo. Zabráníme tím útočníkovi v možnosti použít předpočítané duhové tabulky a zároveň tím bráníme tzv. narozeninovým útokům. Tzn. že při nalezení hashe k jednomu heslu nemůže útočník porovnat daný hash se všemi dalšími hashi v databázi a zjistit tak všechny uživatele, kteří používají stejné heslo (protože přidáním rozdílné soli vzniknou pro stejná hesla rozdílné hashe).

Dříve se jako kryptografická sůl používal login, nebo se třeba vygeneroval náhodný řetězec, který jste si uložili do databáze (abyste ho mohli znovu použít při přihlašování uživatele). Funkce password_hash už si umí sůl sama vygenerovat a vrací ji automaticky jako součást hashe. A k heslu ji „přimíchává“ bezpečnějším způsobem, než je pouhý součet textových řetězců, jak se to dělalo dříve (obtížněji se tedy láme hrubou silou).

Logování akce

Při vytvoření hesla si v tabulce s logy uložíme záznam odkazem na ID uživatele, aktuálním časem a IP adresou uživatele. Může nám to časem pomoci s odhalováním nějaké nekalé činnosti kolem hesel.

Přihlašování k aplikaci

Omezte počet pokusů o přihlášení

Bráníte se tak online útokům. Můžete si u konkrétního účtu logovat, kdy se uživatel naposledy pokusil přihlásit a pokud udělá třeba šest chybných pokusů, dovolte mu další pokus až po čtvrt hodině.

Proti automatizovaným útokům bývá užitečné logovat IP adresy a z každé adresy umožnit omezený počet pokusů o přihlášení, případně pak zobrazit ověření v podobě CAPTCHA. Rizika může snížit také Cloudflare či jiná bezpečnostní proxy služba. A nezapomeňte, toto pravidlo se netýká jen webů či e-shopu, ale totéž platí i pro různá API rozhraní, headless CMS, extranety atd.

Nevyžadujte změny hesla

Pokud uživatel používá správce hesel, má nejspíš také jím vygenerované, unikátní, silné, náhodné a dlouhé heslo – a takové není pořeba si měnit. Naopak běžný uživatel se každou změnou posune k lépe zapamatovatelnému a tedy jednoduššímu heslu. Nebo v lepším případě původní heslo nějak primitivně variuje, třeba tím, že číslo na konci postupně zvyšuje o jedničku. A to samozřejmě nevede k žádoucímu zvyšování bezpečnosti (neboť ze starých hesel lze jednoduše odvodit ta nová). A celé to tedy nedává smysl, pravidelné vyžadování změny hesla tak uživatele pouze zbytečně prudí.

Potřebujete pro šéfa lepší argumentaci? Najdete ji na webech britského National Cyber Security Center nebo amerického Federal Trade Commision.

Zaslání nového hesla

I tahle část bude užitečná hlavně pro vývojáře. Představte si, že uživatel zapomněl heslo do vaší aplikace a potřebuje si vygenerovat nové. Viděl jsem už spoustu implementací, které to dělaly špatně, nebo vyloženě snižovaly zabezpečení aplikace.

Best practice postup po zaslání nového hesla

Pro zaslání hesla existuje jednoduchý postup, který se osvědčuje dlouhodobě. Uživateli vygenerujeme unikátní odkaz na možnost změny hesla a ten mu pro ověření jeho identity pošleme do e-mailu. Nikdy mu neposíláme heslo.

  1. Na webu vytvoříme formulář, na který se odkážeme z přihlašovacího formuláře. Ve formuláři po uživateli chceme pouze vyplnění jeho přihlašovacího jména (loginu).
  2. Po odeslání formuláře ověříme, že login existuje a uplynula patřičná doba od posledního zaslání hesla (třeba jeden den – aby nebylo možné konkrétní uživatele bombardovat námi zasílanými e-maily).
  3. Jestliže vše sedí, vygenerujeme si token, tj. dostatečně dlouhý náhodný řetězec, ověříme si v databázi, že už ho tam nikde nemáme (jinak vygenerujeme nový) a tento token si uložíme k danému loginu, společně s aktuálním datem pokusu o změnu hesla.
  4. Jestliže uživatel neexistuje, neměl by se formulář chovat odlišně, než když existuje, protože jinak pomocí něj lze zjišťovat existenci přihlašovacích jmen uživatelů.
  5. Na e-mailovou adresu uživatele zašleme zprávu, kde ho informujeme o tom, že mu někdo zkouší nastavit nové heslo a že to může směle ignorovat, pokud to sám nevyvolal. Případně může kliknutím na odkaz daný token zneplatnit. A pokud chce opravdu heslo změnit, nechť klikne na jiný odkaz, kam onen token přidáme v podobě parametru a který směřuje na jiný formulář na našem webu.
  6. Na dané adrese přečteme token z parametru a ověříme, zda ho máme v databázi u některého uživatele a zda je ještě platný (například byl vytvořen nejdéle před 60 minutami). Pokud vše sedí, zobrazíme formulář pro zadání nového hesla.
  7. Odpovídá-li nově zadané heslo našim zásadám pro tvorbu hesel, a stále ještě vše sedí, uložíme si ho do databáze (samozřejmě patřičně zaheshované). A zároveň si do zvláštního pole k dříve uloženému tokenu označíme, že už byl využitý a nejde ho tedy použít znovu.
  8. Zalogujeme si informaci o změně hesla uživatele a uložíme si k ní datum a IP adresu, odkud se tak stalo.
  9. Uživatele o úspěšné změně hesla informujeme e-mailem. Ale jde jen o notifikační e-mail, heslo mu pochopitelně neposíláme (úmyslně to opakuji znovu).

Uvedený postup využívá toho, že uživatel zná své uživatelské jméno a my k němu máme v databází uložený e-mail, ke kterému má uživatel přístup. Kterýkoliv z obou předpokladů však nemusí platit, proto je vhodné pod formulář pro zadání přihlašovacího jména ještě přidat odkaz na to, jak postupovat, když jméno neznáme, nebo jsme změnili e-mail. Obvykle je potřeba kontaktovat podporu, která uživatele ověří jiným způsobem.

Neověřujte uživatele pomocí bezpečnostních otázek

Zejména ne pomocí otázek, které mu vymyslíte sami (typicky jméno matky za svobodna). Takové heslo lze snadno uhodnout při určité znalosti daného uživatele a jeho historie, případně je lze zjistit pomocí sociálního inženýrství (zavolám vám pod věrohodnou záminkou a jméno matky z vás vymámím – a vy si to ani nespojíte s tématem bezpečnosti).

Neposílejte heslo e-mailem

Pokud svěříte nové heslo e-mailové schránce uživatele, svěřujete tím i bezpečnost své aplikace zabezpečení této schránky. Kdykoliv v budoucnu se může někomu podařit do schránky nabourat, nebo třeba jen využije krátkého okamžiku, kdy si majitel odběhl od počítače – a heslo do vaší aplikace najednou zná někdo nepovolaný.

Neposílejte ani dočasné heslo e-mailem

Programátoři někdy řeší obavy zmíněné v předchozím odstavci tak, že uživateli vygenerují nové dočasné heslo, které mu ihned nastaví a zároveň mu ho pošlou e-mailem společně s výzvou, aby si nastavil heslo nové. Zdánlivě funkční postup však může být snadno zneužit pro šikanování konkrétního uživatele, neboť třetí osoba zvnějšku má najednou možnost uživateli zrušit jeho původní heslo. A navíc to může dělat jednoduše a opakovaně.

Přesměrování na adresu formuláře pro změnu hesla

Sdružení W3C vytvořilo specifikaci, která doporučuje na adresu /.well-known/change-password umístit přesměrování na váš formulář pro změnu hesla. Pokud tak učiníte, usnadníte tím změnu hesla například uživatelům, kteří si heslo vygenerují ve svém správci hesel. Ten je využitím této specifikace může poslat rovnou na daný formulář, místo aby je poslal na úvodní stránku vašeho webu, kde by museli složitě hledat příslušný odkaz. Není bez zajímavosti, že tuto specifikaci již podporuje například Apple od iOS 12 a Safari 12.

Ošetřete autocomplete

Stejně jako při vytváření hesla přidáme k políčku pro zadání hesla atribut autocomplete s hodnotou new-password, aby sem správce hesel nevyplňoval staré heslo, ale nabídl dialog pro generování nového.

Převod hesel z jednoho systému na druhý

Pokud měníte e-shopový systém, nebo třeba chcete zvýšit úroveň zabezpečení ze zastaralého typu heshování hesel md5 či sha-1 na dnes doporučovaný bcrypt, potřebujete nějak převést hesla uživatelů, abyste je mohli zahashovat znovu. Ale pochopitelně je neznáte, máte uložené jen jejich hashe. Většina vývojářů to řeší tím nejhorším možným způsobem – rozešlou uživatelům e-mail, aby si změnili heslo. Tohle nikdy nedělejte, neotravujte uživatele – s výjimkou situace, kdy u vás došlo k úniku hesel.

Lepším postupem je přidat si u uživatele v databázi další políčko, kde si uložíte typ hashovacího algoritmu. U starých uživatelů tam máte třeba ono md5. A pak původní hash znovu zaheshujete onou aktuálně doporučovanou hashovací funkcí s příslušnou kryptografickou solí (bcrypt). Tím zajistíte bezpečnost starých hashů pro případ budoucího úniku databáze.

Jakmile se uživatel pokusí přihlásit, podíváte se na ono políčko s typem algoritmu – a pokud ho máte uloženého s typem md5, jeho heslo proženete funkcí md5 jako na starém řešení a následně ještě funkcí bcrypt. A teprve tento hash porovnáte s hashem uloženým v databázi.

Pokud oba hashe sedí, víte, že vám uživatel zadal správné heslo a můžete ho přihlásit. Zároveň v tu chvíli máte k dispozici jeho heslo v nezahešované podobě. Proženete ho tedy ještě samotnou funkcí bcrypt a vzniklý hash si uložíte k uživateli do databáze, přičemž si zároveň změníte hodnotu v políčku s informací o typu algoritmu. Při příštím přihlášení stejného uživatele již tedy autentizace proběhne zcela čistě, jako by se k vám zaregistroval již na novém řešení.

Potřebujete toto téma ještě podrobněji? Výborně ho rozebírá Michal Špaček ve svém článku Změna hashování existujících hesel.

Zaujal jsem vás? Přihlašte se do mailingu a mé další texty už vám neuniknou:

 

Zprávy posílám cca 8× ročně. Odhlásit se můžete kdykoliv. Více informací.