Plain nebo hashed

V souvislosti s aktuální situací jedné populární české služby se opět vyrojila nesmyslná diskuse na téma ukládání hesel v plaintextu. V tomto článku bych chtěl sdělit můj názor na věc a také prodiskutovat některé nabízené varianty.

Co je to heslo?

Ještě než začneme, pojďme si nadefinovat základní pojem, kolem kterého se to celé točí, tedy heslo.

Heslo je dostatečně dlouhý řetězec dostatečně náhodných znaků. Dostatečné aktuálně znamená 112b entropie, tedy asi 24 znaků dlouhé. Toto je nutné k tomu, aby se současnou technikou nebylo možné je prolomit v dosažitelném čase pomocí brute force.

Heslo je pro každou službu unikátní.

Autentizace

Abychom se mohli přihlásit k nějaké službě pomocí hesla (slibuji, že vás v tomto článku nebudu opět otravovat mnohem lepším způsobem pomocí asymetrické kryptografie ;-) ) musíme mít možnost, jak na straně serveru ono heslo ověřit. V konečném důsledku musíme porovnat dvě hodnoty. Hodnotu získanou od klienta a hodnotu uloženou na serveru.

A zde přichází onen střet názorů.

Ona hodnota uložená na serveru může být buď heslo v otevřeném tvaru (plain), nebo hashované heslo (hash).

Pokud máme heslo v otevřeném tvaru, klient musí poslat heslo v otevřeném tvaru. Server jej jednoduše porovná. Pokud máme heslo v hash, klient musí poslat heslo zahašované. Opět stačí jen porovnat. Obě možnosti jsou úplně stejné. Klient něco pošle, server něco porovná. Žádná výhoda ani pro jednu stranu.

Existují další možnosti hash (jako solení, digesty, scram). Výsledek je ale +- autobus pořád tentýž. Klient něco musí poslat, to něco se musí porovnat. Na rozdíl od metody, kterou preferuji a kterou jsem slíbil zde neuvádět.  Vyšší metody hašování potom řeší i detekci a bránění se odposlechnutí komunikace, což je ale pro tento případ celkem bezpředmětné, protože veškerá komunikace běží po TLS kde už je toto řešeno.

Obavy odpůrců plain hesel

Po každém podobném případu, kdy se někdo dostane do interních systémů a (mimo jiné) získá i databázi s hesly, jistá skupina lidí začne křičet jaký je to amatérismus, jak si musí měnit hesla apod. Ano, uznávám, je to amatérismus. Ale na druhé straně.

Proč? Jak jsem psal před několika odstavci, heslo je pro každou službu unikátní. Pokud není, a pokud někdo používá jedno heslo pro X služeb, vůbec žádná metoda ukládání hesel v hash ho nezachrání. Důvod je jednoduchý. Stačí, aby jedna služba z oněch X nebyla poctivá, hesla si ukládala bokem (a třeba interně používala třeba onen moderní SCRAM-SHA1) a je to. Už znají vaše heslo i pro X dalších služeb. A vy o tom ani nevíte. Jediná cesta je tedy používat pro každou službu unikátní heslo.

Pokud má tedy někdo obavu o bezpečnost svého hesla, nemůže toto hodit na provozovatele té služby. Pokud ano, znamenalo by to donutit X provozovatelů zavést bezpečnější metodu (ale zase ne tak úplně bezpečnou ;-) ehm sorry, už to fakt nebudu zmiňovat). Už jen to je hromada práce. Úplně zbytečné, a zcela bez kontroly. Stačí jeden nepoctivý.

Výhody hesel v plainu

Moc jich není. Jednou z výhod mít uloženo hesla v plainu je možnost poslat heslo uživateli, který je zapomněl. V takovém případě je ale lepší ze strany služby stejně vygenerovat heslo nové a to mu poslat. Už jen proto, že uživatelé svá hesla nemění příliš často (a o tom, že by měla entropii 112b si můžeme nechat jen zdát), tak tohle je příležitost jak to trochu napravit.

Dále se tím zjednodušuje implementace. Sice jen trochu, ale proč si přidávat práci. Navíc, co se týče haší, spousta lidí se, i dnes, po 10 letech od prolomení MD5 (v roce 2005 šlo vygenerovat dva různé pdf soubory se stejnou hashí, dnes je možné provést kompletní brute force attack na heslo za 15Kč) bude do krve hádat, že MD5 je pro jejich použití bezpečná. Není. Bezpečná není SHA-1. O bezpečnosti SHA-2 se vedou diskuse, a mezitím se projistotu používá výhradně SHA-512 s patřičně zkráceným výstupem (SHA-2 je sice oslabená, ale SHA-512 je tak „velká“ že i v oslabení bohatě stačí pokrýt bezpečností sílu; také už skončil závod o SHA-3, takže máme k disposici moderní a bezpečnou kryptografickou hashovací fci).

Tím, že použijeme plain, si celé tohleto ušetříme.

Proč se používají stejná hesla

Každý (snad, doufám) ví, jak se to dělá správně. Každý si určitě uvědomuje, že používání stejných hesel pro spoustu služeb je špatná praktika. Přesto to lidé dělají. Jako já to dělám taky. Ale jen tam, kde na ničem nezáleží.

Proč. Protože dneska každá kravina potřebuje přihlášení. Mnohdy úplně zbytečně, je to tam prostě proto, že to jde. Na takové služby opravdu nebudu používat unikátní hesla, protože žádná data nechrání. A když dojde k prolomení, tak je mi to fakt jedno. Maximálně někdo napíše komentář mým jménem, ať si to užije.

Edit po zveřejnění článku: tuto situaci mohou zlepšit provozovatelé služeb. Dnes je situace taková, že hromada webů nabízí pouze vlastní způsob autentizace (navíc každý pes jiná ves). 60 webů, 60 autentizačních údajů, 60 hesel. Někde chtějí email (kdo si má pamatovat jaký), někde login, někde PIN. Pro člověka nereálné k zapamatování. Používáním metod jako OpenID (neplést s MojeID) by stačilo mít pouze jeden autentizační údaj a přihlašovat se k mnoha službám. Služba se k heslu při autentizaci openid vůbec nedostane, takže nepoctivý provozovatel má smůlu. Tím, že by to heslo bylo pouze jedno, by mohlo být složitější (1x 24 znaků si snad ještě pamatuju, 60x 24 ani omylem).

Čemu ale nerozumím je, proč po každém takovém případě (a že jich ještě bude ;-) ), se lidé rozčilují nad tím, že někdo může jejich heslo znát. To může znát kdykoliv, i v případě, že není tak čestný a nepochlubí se chybou na veřejnosti. To, že o tom najednou víte, by mělo vést spíše k zamyšlení, zda se opravdu něco stalo a pokud ano, tak si tu situaci na své straně vylepšit. Veškeré nástroje k tomu jsou.

Tož tak. Přeji Pinkymu, ať chybku v systému najde a opraví a některým uživatelům jabbimu, ať se nad sebou zamyslí.

Příspěvek byl publikován v rubrice Názory, Počítače. Můžete si uložit jeho odkaz mezi své oblíbené záložky.

15 komentářů: Plain nebo hashed

  1. z0ny napsal:

    No hele, ten tvuj clanek je sice peknej, ale ja s nim nemuzu tak uplne souhlasit. A to z nekolika duvodu.
    1. jak pises 20x 24mistny heslo si proste nezapamatuju.
    2. na dost sluzeb si je potrebuju pamatovat, protoze se neprihlasuju z jednoho mista :)
    3. ne vzdy muzu tahat treba flashku, pripadne ji do zarizeni zapojit

    Tak a ted me rekni jak to mam jako uzivatel vyresit? Logicky vzato budu mit par hesel, ruzne obtiznych, rekneme kolem 5ti coz se da zapamatovat ale urcite nemaji 24 znaku :) A ted k tomu o cem je clanek, kdyz ta sluzba to ma v plaintextu tak pripadny utocnik zna moje heslo = muze ho pouzit jinde, pripadne muze prijit na system delani hesla. Kdyz tam je aspon nejaka hash, tak i kdyby byla slaba, tak nevi co tam je a nepozna z toho princip delani hesla :)
    Je mi to jinak celkem fuk, na dulezity sluzby mam unikatni hesla, ale bohuzel pristupny jen z urcitych zarizeni. Jen si myslim ze ukladani hesla v plaintextu je z principu spatne. Kdyby slo pouzit klice vsude, tak super, ale rekneme si uprime, kde to najdes? Na tech 0.1% webu co potrebuji prihlaseni? :)
    To je to proc si myslim ze paintext neni dobrej :)

    • Heron napsal:

      Hehe, čekal jsem tě :-D

      A ted k tomu o cem je clanek, kdyz ta sluzba to ma v plaintextu tak pripadny utocnik zna moje heslo

      Ten článek je hlavně o tom, že onen „útočník“ může úplně klidně být samotný provozovatel onoho webu. A to se nikdy nedozvíš. A bude to rovna ten, který bude mít tu db zahashovanou nejlepší fcí na světě (pod svíčkou je největší tma).

      Já jsem se snažil především upozornit na to, že to, že se někdo dozví o nějakém útoku vůbec neznamená, že se:

      a) dozví o všech utocích (naopak většina úniků dat je pečlivě střežená a málokdo z provozovatelů má odvahu se tím veřejně chlubit)

      b) ta hesla nebude prodávat rovnou majitel té služby (uvážím-li, jak drahé jsou jen seznamy emailových adres, tak někdo může snadno podlehnout a přístupovou db prostě prodat).

      Jinými slovy, pokud někdo považuje únik hesla za problém, ať chce nebo nechce, musí si to vyřešit na své straně. Žádná jiná varianta (v případě použití hesel) neexistuje. Ve chvíli, kdy už to heslo pošle ho rovnou může považovat za prozrazené.

      Tak a ted me rekni jak to mam jako uzivatel vyresit?

      No, blbě. Hlavní potíž vidím v počtu různých loginů. Já mám několik desitek loginů, přičemž valná většina je naprosto zbytečných, vůbec nic nechrání a je tam jen proto, že někomu připadalo jako dobrý nápad dát nějakou kravinu za login.

      Nebýt toho, tak mám 5 skutečně důležitých účtů (banka, login k CA, login k ovládání VPS, emaily, hmmm tak asi 4) a dalších 56 vůbec nepotřebuju.

      Abych nebyl špatně pochopen, já nemám vůbec nic proti zlepšení bezpečnosti. Právě naopak. Jenže v praxi to dopadá tak, že se používá třeba právě MD5 a autor si nechce nechat vysvětlit, proč je to špatně. Brute force MD5 dneska stojí 15 Kč. A současně jsou to zrovna ti samí lidé, kteří současně volají po hashování. Mě to připadá, že zkrátka chtějí jen nálepku: zabezpečeno, ale vůbec nic pro to nechtějí udělat. (Což se vyskytuje i v asymtrické kryptografii, viz: http://www.heronovo.cz/ne-bezpecnost-ssl/ )

      Já bych byl velmi rád, kdyby ty weby nasadili alespoň SCRAM. Ten řeší i MITM útok na autentizaci apod. věci. Jsem všema deseti pro. Ale praxe bohužel ukazuje přesný opak. Když se stane podobný případ, tak všichni křicí „jéééé, amatéři, nemají hash“ a prozovatel udělá to nejjednodušší co může, otevře knížku o PHP a dá tam MD5… Zažil jsem, nebudu konkrétní. Takové „zabezpečení“ je na nic. Ale uživatelům to asi stačí. Mají tam nálepku: zahešováno.

      Proč je to na nic? Protože útočník, pokud se na ten server dostane, tak sice nezíská hesla z DB, ale klidně si může pozměnit ten PHP kód. A na místě, kde je

      hash = md5($heslo)

      si dá klidně

      fwrite ($heslo)

      a ten soubor si bude posílat curlem na svou adresu.

      Viděl jsem i mazanější věci (útočníci, když mají tuto možnost, tak se zaměřují spíše na posílání spamů a scanování okolních sítí – staví si botnet – ty skripty už jsou dneska docela hodně sofistikované a odposlouchávají i hlavičky, tedy včetně všech parametrů, tedy i včetně hesel.)

      • Heron napsal:

        Mimochodem, ona to nemusí být jen MD5. Já jsem prepared statements používat dřív, než jsem vůbec věděl, že nakonec nebudu dělat programátora ale admina (ne, že by to s tím nějak souviselo :-) ).

        Je mi ale velkou záhadou, jak je možné, se že po dalších 10 letech stále objevují SQL injection. Tohle fakt nechápu. Nejen SQL injection samozřejmě, tohle se týká kde čeho. Opravdu bych čekal, že dneska tyto věci budou těžkou minulostí.

        • z0ny napsal:

          Tak to me zahadou neni. Ale to je jine tema.
          Ja v podstate souhlasim s tim co pises, ale stejne je clovek klidnejsi, kdyz mu ukradnou md5ku hesla, nez cisty heslo, viz co sem psal pred tim. Spis me stve, ze clovek musi mit plnou p…l hesel, ktery si stejne nekam uklada… Chtelo by to mit vsude neco jako OpenID, ale server co by to overoval by byl ten muj, mozna to nejak jde, nevim :-)

          • Heron napsal:

            Já měl na svém serveru poskytovatele OpenID už někdy v 2007 (a vlastně jenom v roce 2007, tehdy byl kolem toho na abclinuxu takový malý boom) a používal jsem to na tu jednu službu, co to tehdy podporovala. Dnes je těch služeb přesně 0. Je to další z dobrých věcí, která skončila na smetišti dějin.

            V roce 2008 se stal poskytovatel i Seznam.cz, jak a kdy to skončilo ani nevím.

            Dneska se rozmáhá tzv. MojeID od NIC.cz, což je technicky sice skoro totéž, ale na svůj server si to nenainstaluješ, je to centrální (tedy nepoužitelné).

        • Filip Jirsák napsal:

          Protože je to takhle popsané v milionech návodů pro PHP po celém webu. Protože i když se nějaký návod zmiňuje o prepared statements, vždy se nejprve probere mysqli, a teprve pak pro pokročilé následují další metody. A když už se to někde začne řešit, tak někdo přijde s tím, že prepared statements jsou v PHP špatně implementované, a mohou být pomalejší. A případně, že je potřeba hlavně escapovat (to je podobá víra, jako to hashování…).
          Pomohlo by asi jedině to, pokud by autoři PHP našli odvahu a mysqli označili jako zastaralé a pak odstranili. Samozřejmě že SQL injection je problém i v jiných prostředích, ale PHP podle mne bohatě vede, už jenom pro to, jak hodně se používá.

          • Heron napsal:

            Něco na tom bude.

            Asi se pohybuji ve špatných kruzích, já jsem db connector, který by nepreferoval prepared statements (nebo třeba kurzory) už roky neviděl.

            Ad kurzory, může mě vzít ďas, když v kódu po nějakém out of memory eventu najdu něco jako:

            foreach (record in mysql_fetchall)

            Potom se memory limity nastavují na astronomické hodnoty, zatímco při iteraci přes kurzory by stačilo pár kB.

            Ale to už je fakt brutálně OT.

    • Jenda napsal:

      Tak a ted me rekni jak to mam jako uzivatel vyresit?

      Jako uživatel s tím moc nenaděláš (maximálně můžeš použít nějakého online správce hesel, což je samozřejmě nic moc), ale programátoři (služby, klientů…) mohou implementovat lepší způsob přihlašování, kdy se server heslo nikdy nedozví, a proto můžeš použít to stejné heslo na více serverů a nic se nestane. Lze k tomu použít například deterministické asymetrické klíče.

  2. Bedňa napsal:

    Nechsa to berie ako chceš, hash je o level vyššia bezpečnosť.

    Predstav si že niekto ukradne databázu a pozametá po sebe a nikto sa nič nedozvie. Má otvorený prístup na všetkých užívateľov a to je fakt prúser.

    MD5 už hádam nikto nepoužíva, kto predsa tak tomu je škoda niečo vysvetľovať.

    SHA1 nieje prelomená, len za určitých okolností sa zmenšuje počet nutných útokov cez BFA. Kto samozrejme serióznu sľužbu nechá bombardovať na prihlásanie si nič iné ani nezaslúži.

    • Heron napsal:

      Predstav si že niekto ukradne databázu a pozametá po sebe a nikto sa nič nedozvie. Má otvorený prístup na všetkých užívateľov a to je fakt prúser.

      Stejně tak si tam může dát sniffer a má totéž. (Takových stránek je.)

      MD5 už hádam nikto nepoužíva, kto predsa tak tomu je škoda niečo vysvetľovať.

      No to by ses divil. I v roce 2014 bohužel vycházejí knížky, kde se směle používá a doporučuje.

      SHA1 nieje prelomená, len za určitých okolností sa zmenšuje počet nutných útokov cez BFA.

      Je prolomená z definice. Spousta lidí si „prolomení“ vysvětluje tak, že se nutně musí najít kolize ať již prvního či druhého řádu. Nikoliv. Funkce se má za prolomenou, pokud se podaří snížit její sílu. SHA1 a SHA2 už jsou kryptograficky prolomené.

      Jinak já dělám hlavně pro státní správu (ale jsem zaměstnanec soukromé firmy). SHA-1 se nesmí (v podpisových alg.) používat už od roku 2010. MD5 se nesmí používat od 1995 (resp. v Česku nikdy). Pro mě jsou kompletně mimo hru.

      Teď se jede na SHA 512/256 (zkrácení výstupu z funkce SHA-512). SHA-2 je oslabená, ví se to, ale aktuálně nelze dělat nic jiného než doufat, že nikdo nepřijde na vylepšení útoků a nesníží bezpečnost o další rundy, to by byla skutečná katastrofa (PKI by ze dne na den přestalo reálně existovat).

  3. Bedňa napsal:

    Sniffer sa dá objaviť, takže rozdieľ v tom vidím.

    Autora knihy ktorý doporučuje MD5 by mali nakopať do zadku od predku :) To už je fakt silná káva.

    Jasne o SHA-1 máš pravdu, len som pokľadal za významné oddeliť ho od skutočne zlomeného MD5.

  4. David Ježek napsal:

    No ono často je o to , že každá stupidní malá službička či bezvýznamný web má povinnou registraci čistě proto, aby zabránil spamu či zasírání diskusí náctiletými primitivy. Bývaly doby, kdy jsme to na CDRku měli plně otevřené, pak jsme tam tuším museli přidat antispam (ta jednoduchá otázka „kolik je 6+2, tuším) a pak jsme to prostě jednoho krásného dne udělali přes registrace, protože ten stav byl neúnosný. A že jsme měli luxusní systém banování konkrétních uživatelů (bez ohledu na to, zdali byli anonymní, nebo registrovaní). Jenže ono trávit X desítek minut denně procházením diskusí a banováním idiotů, to není dobrá pracovní náplň pro redaktory.

    Ano, i já mám desítky loginů na desítky služeb, na řadě stejných. A to čistě proto, že jsem třeba potřeboval jen zobrazit jednu konkrétní fotku a dané zku*vené diskusní fórum vyžaduje pro zobrazení příloh login. pak obvykle dělám generickou registraci s kombinací jméno/heslo, kterou neobměňuji. Interenet je jeden velkej bordel a ať už bude jakákoli metoda zabezpečení účtů, bude bordelem i nadále. Naše česká výhoda je, že lokální služby jsou obvykle velkým hackerům ze zahraničí u řiti.

Komentáře nejsou povoleny.