Vlákno názorů k článku Hash kódy bez tajností, nejen LinkedIn a ti další od Tany - A kvůli podobným myšlenkám je ročně kdovíkolik služeb...

  • Článek je starý, nové názory již nelze přidávat.
  • 23. 6. 2012 15:21

    Tany

    A kvůli podobným myšlenkám je ročně kdovíkolik služeb kompromitováno únikem už. dat. Existuje spousta způsobů, jak útočníky velmi znepříjemnit práci, ale vyžaduje to ve firmách programátory a ne bastlení zakázek pomocí studentů za pár korun. Eshop u kterého po zadání apostrofu do login formuláře vyskočí SQL chyba .. to by mělo být trestné, nakládají totiž nečekaně s osobními údaji.

  • 23. 6. 2012 10:48

    Filip Jirsák

    Vy to řešíte, jak kdyby tím mělo být zabezpečené odpálení atomové bomby... Když si uvědomíte, jak to vypadá u uživatele -- webový formulář, heslo uložené v prohlížeči a odeslané přes nešifrované spojení -- je to vaše zabezpečení na straně serveru mnohonásobně předimenzované. V současné době myslím bohatě stačí, aby na serveru byly hashe osolené klidně konstantním hashem.

    Do té doby, než se standardně bude používat aspoň něco na úrovni HTTP DIGEST a než bude součástí webových protokolů způsob, jak takovéto heslo nastavit a změnit (samozřejmě tak, že se na server odešle už serverově specifický hash a ne heslo v otevřeném tvaru), nemá smysl uvažovat o praktickém nasazení něčeho bezpečnějšího. To, že se hesla zadávají do webových formulářů, odesílají se v otevřeném tvaru, odhlašuje se opět webovým formulářem a mezitím je uživatel autentizován pomocí cookie, nejlépe vypovídá o reálném nezájmu o nějakou bezpečnost v prostředí webu.

  • 23. 6. 2012 14:15

    Waseihou (neregistrovaný)

    Bohužel s vámi nemůžu souhlasit. I když data jsou posílány nezabezpečeně, je zde jeden zásadní rozdíl - server uchovává hesla a osobní údaje velkého množství uživatelů, takže pokud se k nim někdo dostane tak je to daleko větší problém než když někdo odposlechne jednoho konrétního uživatele. Předpokládejme že velká část uživatelů používá stejné heslo do více služeb, třeba i internetového bankovnictví, takže pokud k úniku dojde tak je to fakt průser. Navíc když už pak k úniku opravdu dojde a je to takto zabezpečené, tak to není taková ostuda...

  • 23. 6. 2012 18:10

    Filip Jirsák

    Jenže on server hesla neukládá, jen jejich hashe.
    To si vy myslíte. Ale zdrojáky jste neviděl. Jistý si můžete být jedině tehdy, když serveru heslo v otevřeném tvaru vůbec nikdy nepošlete -- ani při registraci, ani při autentizaci. Jenže o takové zabezpečení na webu nemá skoro nikdo zájem. Jsou důležitější věci na implementaci -- video, kulaté rámečky...

  • 24. 6. 2012 17:49

    NN (neregistrovaný)

    Tak prosím vysvetli naivnému programátorovi, v čom je tento algoritmus http://pastebin.com/WiS9VvGA nebezpečnejší ako tupé ukladanie hashu a soli do jednej tabuľky.

    IMHO: ak útočník získa hash napríklad cez SQL injection, získa z DB rovno aj SALT a nie je nič jednoduchšie ako sha1($pass.$hash). Ak uložím konštantný SALT do súboru, zabránim veľkému percentu útokov vyplývajúcich zo zneužitia SQL injection. Za naivné skôr považujem riešenie typu hash = sha1($pass.$hash).

  • 23. 6. 2012 18:00

    Waseihou (neregistrovaný)

    Jenže on server hesla neukládá, jen jejich hashe.

    Přihlášení (uživatel zadal svůj login a heslo):

    1. podle loginu najdi sůl
    2. pomocí soli a hesla vypočítej hash stejným způsobem jako při registraci
    3. porovnej vypočtený hash s tím uloženým v databázi (to může dělat třeba oddělený proces a nebo jiná třeba virtuální mašina, v nejhorším skript který který má jako jediný právo číst AES klíč na disku a který vrátí ANO nebo NE)
    4. pokud se shodují, autentizace uživatele proběhla úspěšně a je přihlášen, jinak uživatel zadal neplatné jméno nebo heslo

    Z toho také vyplývá, že provozovatel internetové služby je ve stejné pozici jako případný hacker - ani pro něj samotného není možné pomocí hashe heslo uživatele získat. Slušný web hesla vůbec neukládá!

  • 23. 6. 2012 19:23

    Waseihou (neregistrovaný)

    Ale samozřejmě že server má možnost hesla ukládat, ale to je potom chyba rovozovatele oné "darebácké" služby. Zákazník by ale měl mít právo očekávat, že internetové služby nabízené komerčně budou mít jistou kvalitu zabezpečení, a obvykle tedy neexistuje důvod aby hesla byla uchovávána, protože ani její provozovatel to nutně nepotřebuje. U některých služeb bych pak očekával že si nechají udělat bezpečnostní audit aby zvýšili svojí důvěryhodnost u zákazníka. Ale obyčejných služeb není nutné aby hesla byla jakkoliv uchovávána a implementace toho co popisuje by neměla mít výrazný dopad na dobu implementace, přitom míra zabezpečení se rapidně zvýší.

  • 24. 6. 2012 19:57

    NN (neregistrovaný)

    Niekde píšem ako dement, pardon, opravujem:

    Mám za to, že práve tomto v konkrétnom prípade desaťtisícnásobne predĺži čas, potrebný na prelomenie hrubou silou alebo na vygenerovanie
    rainbow tabuliek. A to nie je zanedbateľné.

    Prihadzovanie časti saltu alebo použitie celého saltu môže byť rovnaké, s tým súhlasím. Ale aj keď nedokážem spočítať vplyv na výskyt CYKLOV, intuitívne predpokladám, že VÝSKYT CYKLOV bude menší, ak sa bude množina použitých znakov v reťazci pre jednotlivé prechody cyklom meniť.

  • 24. 6. 2012 20:02

    NN (neregistrovaný)

    strlen(SALT)==10 z pohledu reálné bezpečnosti stejně bezpečné jako ten váš příklad

    Aha, už mi začína svitať ako to myslíte. :)

  • 24. 6. 2012 21:38

    Filip Jirsák

    Pokud si uživatel zvolí o 3 znaky delší heslo, prodlouží tím tenhle typ útoku více než 2×105 násobně. Pokud o 4, bude to prodloužení 107 násobek. To to vícenásobné hashování zase není takový zázrak, že? Navíc to vícenásobné hashování musí zvládnout produkční stroj v rozumném čase a pro spoustu souběžných požadavků, když se chce přihlásit víc uživatelů najednou.

  • 24. 6. 2012 19:01

    NN (neregistrovaný)

    Videli ste odkazovaný kód? Idea je v tom, že SALT útočník nepozná, pretože typicky cez SQL injection získa len to, čo je v databáze, t.j. login, hash a dynamický salt, ktorý je v tomto konkrétnom prípade login. Ďalej je idea v tom, že aj keď útočník pozná algoritmus, nepozná konštantný salt definovaný v súbore, ktorý je pre každú inštaláciu rôzny – a práve tu to viacnásobné hashovanie pomôže, pretože útočníkovi znemožní brute force v rozumnom čase a generovanie dúhových tabuliek pre konktérny algoritmus v rozumnom čase.

    Myšlienka je tiež v tom, že nejde o jednoduché viacnásobné hashovanie, ale o pridávanie rôznej časti saltu pre každý jednotlivý prechod cyklom. Solí sa teda zakaždým inou časťou soli.

    Práveže sa snažím uvažovať z pozície útočníka a myslím si, že toto sa bude lámať ťažšie ako prípad, kedy je síce použitý silný hasnovací algoritmus (napr. bcypt), ale nie je pužitá konštatná soľ ale len soľ v databázovej tabuľke uložená spolu s loginom a výsledným hashom.

  • 24. 6. 2012 19:16

    Filip Jirsák

    sha1(SALT.$lo­gin.$password)
    je i pro strlen(SALT)==10 z pohledu reálné bezpečnosti stejně bezpečné jako ten váš příklad. Akorát nebude programátora mást nesmysly a vyvolávat v něm nepravdivý dojem, že něco tak složitého musí být ultrabezpečné a žádné jiné zabezpečení už není potřeba řešit.

    a práve tu to viacnásobné hashovanie pomôže
    Nepomůže, je tam úplně zbytečné.

    Myšlienka je tiež v tom, že nejde o jednoduché viacnásobné hashovanie, ale o pridávanie rôznej časti saltu pre každý jednotlivý prechod cyklom.
    Což je v nejlepším možném případě stejně dobré, jako přidání celé soli k jednomu průchodu hashovací funkcí.

    myslím si, že toto sa bude lámať ťažšie ako prípad, kedy je síce použitý silný hasnovací algoritmus (napr. bcypt), ale nie je pužitá konštatná soľ ale len soľ v databázovej tabuľke uložená spolu s loginom a výsledným hashom.
    To je právě ten problém, že stavíte jen na vašich dojmech a ne z rozboru algoritmu. Bohužel bezpečnostní algoritmy jsou neintuitivní a to, co vyvolává dojem zvýšení bezpečnosti, je v mnoha případech jen bezcenná hra, v mnoha dalších případech je to dokonce snížení bezpečnosti.

  • 24. 6. 2012 19:49

    NN (neregistrovaný)

    Mohli by ste zdôvodniť, v čom je to viacnásobné hashovanie zbytočné, ak ide o lámanie hashov hrubou silou? Mám za to, že práve toto v konkrétnom desaťtisícnásobne prípade predĺži čas, potrebný na prelomenie, prípadne hrubou silou alebo na vygenerovanie
    rainbow tabuliek. A to nie je zanedbateľné.

    Prihadzovanie časti saltu alebo použitie celého saltu môýe byť rovnaké, s týmsúhlasím. Ale aj keď nedokážem spočítať vplyv na výskyt kolízií, intuitívne predpokladám, že kolízií bude menej ak sa bude množina použitých snakov v reťazci pre jednotlivé prechody cyklom meniť.

    To, že útočník musí poznať spoločný SALT, ktorý je uložený v súbore nie je zvýšenie bezpečnosti oproti príkladu, ak je použitý len salt v databáze? Nepresvedčili ste ma a silne pochybujem o Vašich argumentoch. Je rozdiel hacknúť web len cez SQL injection a hacknúť web cez SQL injection a SÚČASNE cez obsah súboru na disku, kde je definovaný spoločný salt pre výpočet hashu.

  • 24. 6. 2012 20:39

    NN (neregistrovaný)

    Konkrétny príklad, kedy viacnásobné hashovanie pomôže:

    útočník získa hashe z databázy, získa algoritmus ich tvorby a získa aj spoločný SALT definovaný v súbore. V tomto momente potrebuje útočník prelomiť získanú sadu hashov, aby sa dostal k účtom užívateľov. Može skúsiť slovníkový útok, čo neprelomí slovníkovým útokom, skúsi prelomiť hrubou silou. A práve tu vniká rozdiel v čase, potrebnom na tento úkon. Rozdiel medzi algoritomom sha1(SALT.$lo­gin.$password) a desaťticícnásobným hashovaním bude výrazne lepší v prospech opakovaného hashovania uvedeným algoritmom. To totiž spôsobí desaťtisícnásobné navýšenie času, potrebného na vykonanie útoku hrubou silou, čo môže daný informačný systém prakticky zachrániť.

    Ak sa to dá vôbec povedať o systéme, kde je možný vykonať SQL injection a dump zdojového kódu. :-)

  • 25. 6. 2012 12:30

    bez přezdívky

    "Nabízené komerčně" -- a jsme u toho. Kolik platíš za Gmail, Youtube, LinkedIn, Lupu, Seznam, Novinky... ?

    Já si na webu platím jedinou službu (a štve mě a už to neudělám) -- Piano (SK prstenec webů).

    Takže kde mi vzniká morální právo požadovat po provozovatelích služeb zdarma, aby "dělali víc, než ostatní"?

  • 25. 6. 2012 13:01

    Waseihou (neregistrovaný)

    Pod pojmem komerčně jsem měl namysli třeba internetové bankovnictví, tam opravdu očekávám kvalitní zabezpečení celého systému. Co se free služeb týče, u některých z těch uvedených by byla ostuda kdyby to měli zabezpečené jako amatéři, u jiných by mě to bohužel nepřekvapilo. Na druhou stranu nejde o něco extra složitého co by nešlo naimplementovat, myslím že více času se strávilo nad tím kam umístit reklamu místo na zabezpečení, které je jednorázová investice.

  • 25. 6. 2012 15:18

    Waseihou (neregistrovaný)

    Dobře, a jaké je to řešení ať se poučím? Pravděpodobně něco s certifikáty a podobně?

  • 25. 6. 2012 15:34

    Filip Jirsák

    Pro přihlášení třeba HTTP DIGEST. Ovšem chtělo by to k tomu ještě standardizovaný způsob, jak z prohlížeče vytvořit účet. Teď je to možné udělat s pomocí JavaScriptu, ale ten asi bude málokdo kontrolovat, zda opravdu heslo na server neodesílá.

  • 27. 6. 2012 8:02

    Filip Jirsák

    10000× opakování útočníka neodstaví o nic víc, než 1 opakování se solí. Navíc pokud to serveru bude trvat čtvrt sekundy a přihlásí se najednou 1000 uživatelů, budou někteří čekat na přihlášení 4 minuty. Ten scénář, kdy opakované hashování s dynamickou solí může systém zachránit, by mne zajímal. Podle mne neexistuje takový scénář, kde by opakované hashování něco zachránilo, ale jednoduché ne.

  • 24. 6. 2012 22:01

    Filip Jirsák

    Sůl uložená mimo databázi samozřejmě pomůže v případě napadení databáze, když se útočník nikam jinam nedostane. Jenže obrana proti SQL injection je triviální a navíc už je dost velký průšvih i jen to, že se uživatel dostane ke všem ostatním údajům z databáze.

    Důležité je ale hlavně to, že když jsou unikátně osolena jednotlivá hesla, musí útočník útočit hrubou silou na každé heslo zvlášť. V takovém případě nejspíš využije jiné údaje z databáze, a nebo pokud chce zaútočit na konkrétní účty, nebude se pokoušet lámat je hrubou silou, ale spíš se pokusí uživateli něco podstrčit, donutit jej ke změně hesla apod.

    Jinak pokud má být uložení hesla opravdu důvěryhodné, musí uživatel sůl vidět -- aby si mohl ověřit, že se server nepokouší solit stejnou solí, jako jiný server. Tím pádem padá jakékoli zabezpečení postavené na tom, že sůl je tajná. Z toho je taky vidět, že nejdůležitější je hlavně to, aby měl uživatel silné heslo. Slabé heslo nezachrání seberafinovanější opatření na straně serveru.

  • 25. 6. 2012 13:29

    Filip Jirsák

    Záleží na tom, čemu říkáte „jako amatéři“. Třeba Seznam nebo Google nejspíš hesla ukládají v otevřeném tvaru, protože poskytují mnoho služeb a další přidávají – POP3, IMAP, Jabber… A tyto služby používají různé způsoby autentizace. Takže by provozovatel musel se spuštěním každé nové služby vyžadovat od uživatele znova zadání hesla, aby si mohl uložit ten správný hash. A nebo si prostě hesla od začátku ukládá v otevřeném tvaru.

    Jinak je hezké, jak pořád píšete, co by provozovatel měl a že doufáte, že se podle toho chová. To jsou pořád ale jen řeči, úplně stejné, jako když provozovatel tvrdí, že má databázi zabezpečenou a neosolený hash tak není žádný problém. Pokud by šlo skutečně o bezpečnost, nebudeme předpokládat a doufat, ale začneme používat řešení, ve kterých provozovatel heslo v otevřeném tvaru nikdy nedostane.

  • 26. 6. 2012 20:38

    NN (neregistrovaný)

    To je síce pekné, ale chcieť od úžívateľa nejakej webovej služby 15 znakové heslo je z pohľadu BFU drzosť. 10k opakovaného hashovania zvládne server za štvrť sekundy. Kde je problém? Nikde. Server to nezrujnuje, no útočníka to odstaví. Navyše ak bude útok vedený na admin heslo nejakej služby, je počet účtov nepodstatný, môže tam byť kludne jeden alebo rádovo jednotky.

    Ja si ten hash v db radšej poriadne osolím a opakovane zahashujem s dynamickou soľou meniacou sa pre každý prechod. Pretože existuje scenár, kedy to môže systém zachrániť. Nemusí to byť SQL injection alebo iná diera, ale kľudne únik db a zdrojákov aplikácie z hostingu.

  • 4. 7. 2012 12:23

    Justas (neregistrovaný)

    Nesouhlasím. Vzhledem k tomu, že žádná hash funkce není bezkolizní (už ze svého principu), nehledá útočník správné heslo, ale jakékoli heslo dávající pro danou sůl správný hash. S délkou hesla to pak příliš nesouvisí - je-li délka osoleného hesla alespoň stejná jako délka hashe, další prodlužování bezpečnost nezvýší, protože s prodloužením hesla se zvyšuje počet kolizí.
    Pak se jako důležitý parametr objevuje čas, za který lze provést jeden pokus.
    Z tohoto hlediska přináší delší salt jen větší počet kolizí (pokud je připojen pouhým concatem, lepší je xorování podle principu Vigenerovy šifry) a prodloužení času na jeden pokus, protože tím se prodlužuje čas potřebný pro vytvoření rainbow tabulek.
    Souhlasím s tím, že i pro větší počet konkurenčních požadavků musí dát server odpověď v rozumném čase; ale na druhou stranu to lze předpokládat; pokud se budu domnívat, že na můj web se může během jedné minuty přihlásit tisíc lidí, asi budu mít hardware dimenzovaný úměrně tomu, že se tam bude tolik lidí pohybovat. Čili to asi nebude vyřazený notebook.

  • 22. 6. 2012 13:54

    Petr (neregistrovaný)

    Ano, tohle je jedna z klasických elementárních chyb naivního programátora. Pomocí Google najdete snadno vysvětlení, proč je tohle nebezpečné...

  • 22. 6. 2012 12:24

    lzap

    Problém uhádnutí hesla lze zcela jednoduše vyřešit jednou provždy. Stačí heslo se seedem zahešovat mnohokrát po sobě (např. 1000x). Server to příliš nezatíží (zas tolik lidí heslo v jeden okamžik neověřuje), ale útočníkovi se hádání neúnosně protáhne protože musí provádět základní hashovací operaci 1000xN kde N je počet opakování vedoucí k uhodnutí hesla. Společně se zmíněným seedem, který se nesmí útočník dozvědět, a dobrou hashovací funkcí je to podle mého názoru dosti bezpečné.

  • 22. 6. 2012 16:15

    Waseihou (neregistrovaný)

    Na to je lepší použí PBKDF2 neby bcrypt, nikoliv takovouto prasečinu. A jako minimální řešení pro trochu bezpečnosti je třeba mít pro každého usera jeho vlastní dokonale náhodnou sůl vygenerovanou kryptograficky bezpečným generátorem, třeba blum blum shub. Sůl by měla být alespoň stejně dlouhá jako je výstup hashovací funkce, takže pro SHA-1 160 bitů neboli 20 znaků nebo více. V databázi pak ukládáma hash(salt+pas­sword), salt pro každého usera. Tohle se dá ale stále lámat slovníkovým útokem a burte forcem, dnes se používá i výhod GPU při testování všech možností. Právě proto se má správně použít key stretching, ale ona primitviní metoda ne - musí se použít PBKDF2 nebo brcypt, a důvodem je aby to měl hacker při slovníkovém/brute force útoku složitější. Pravdou je že málokdo to dneska takto implementuje, oni často ani nesolí, natož aby implementovali nějaké standardy...

  • 23. 6. 2012 16:05

    Filip Jirsák

    Asi reagujete na jiný komentář. Zabezpečení má smysl jedině tehdy, když je konzistentní, tj. nemá smysl řešit šifrování hashů hesel osolených kryptograficky bezpečnou náhodnou solí a vedle mít bezpečnostní díru jak vrata, která útočníkovi vydá všechny osobní údaje (e-maily, telefony atd.), jenom ta hesla nedokáže rozluštit. Lepší je mít hesla obyčejně osolená konstantou, a další energii věnovat tomu, aby se útočník k databázi vůbec nedostal.

  • 23. 6. 2012 15:58

    Filip Jirsák

    Pokud uživatelé používají stejná hesla, nebudou mít problém jenom v případě napadení nějaké služby. Kde má uživatel zaručeno, že se nepokusí jeho heslo zneužít i provozovatel nějaké služby, že nebude hesla do bankovnictví zkoušet třeba majitel nějakého chatu? Kdyby heslo nikdy neopustilo prohlížeč a při jeho vytváření a ověřování se na cílový web posílal jenom hash, měl by uživatel mnohem větší jistotu. Vždyť co nám teď vadí? Že víme, že LinkedIn ukládat neosolený hash. Když nějaký web ukládá hesla v otevřeném tvaru a nikdo to neví, jsou všichni spokojení a užívají si (iluzi) bezpečí.

    Jinak právě proto, že server neukládá jen hesla, ale také osobní údaje, bych hesla ukládal hlavně osolená, a další energii bych nevěnoval šifrování, ale zabezpečení toho, aby se k datům pokud možno nikdo nepovolaný nedostal. Únik e-mailových adres a případných dalších osobních údajů bych vnímal jako horší problém, než to, že budou všechna hesla na serveru osolená stejnou solí.

  • 24. 6. 2012 18:40

    Filip Jirsák

    Uvědomte si, co hash dělá. Mapuje libovolný vstup do omezené množiny výstupu. Když stejnou hashovací funkci zopakujete na tento výstup, aplikujete hash na omezenou množinu vstupu, výstup bude množina maximálně stejně velká, jako vstupní množina. Při opakovaném aplikování stejné hashovací funkce tedy počet hashů na výstupu bude konvergovat k nějakému omezenému počtu prvků, teoreticky až k jednomu hashi. Pokud byste takhle dokonvergoval k jednomu hashi, vyhoví mu jakékoli heslo, pokud by jich na výstupu bylo třeba 50, můžete heslo náhodně tipovat a v průměru vám každé 50 náhodně zvolené heslo projde. To asi nebude nejlepší způsob zabezpečení.

    I kdybyste použil špatně navrženou hashovací funkci, která by pro hashování vlastních hashů generovala minimum kolizí, opakované hashování přináší málo užitku. Vžijte se do role útočníka, který zná heslo v otevřeném tvaru a hash, a předpokládá, že jste použil sůl a/nebo opakované hashování. Pokud použijete dvouznakovou sůl složenou z velkých a malých písmen a číslic, bude muset útočník vyzkoušet přes tři a půl tisíce kombinací, než sůl odhalí. Když použijete opakované hashování 1000×, odhalí to po 1001 pokusech. Nebo-li stačí prodloužit sůl o dva znaky a hashovat jednou, a získáte tak lepší bezpečnost, než při tisícinásobném hashování.

    Takže naivní je vícenásobné hashování, naivní je také prodlužování soli na desítky znaků. Jinak podstatná nevýhoda neosolených hashů je to, že pro ně existují už hotové duhové tabulky. Když použijete sůl a i když ji útočník bude znát, musí si tabulky generovat znovu, takže reálně získá jen ta nejjednodušší hesla, pro která bude moci tabulky vygenerovat.

    Pokud tedy použijete desetiznakovou proměnlivou sůl a jednonásobné hashování, je to pro zabezpečení hesel hashování dostatečné a prodlužování soli nebo opakované hashování neznamená žádné reálné zvýšení bezpečnosti. Ušetřený čas a peníze pak můžete věnovat třeba nahrazení dávno zastaralého přístupu k SQL databázi novějším (starým jenom asi 15 let), který je proti SQL injection odolný.

  • 22. 6. 2012 16:25

    Waseihou (neregistrovaný)

    Takže účelem key stretchingu je aby tento typ útoku trval tak dlouho, že bude prakticky neproveditelný. Jo a další zlepšovák který jsem opoměl je zašifrovat hashe v databázi pomocí AES, klíč ale nesmí uniknout a rozhodně nesmí být v databázi. Tady se asi hodí TPM modul či jiný dedikovaný hardware. Když není nic lepšího, tak klíč alespoň uložit na disk jako soubor a doufat že se k tomu útočník nedostane, obrana před SQL Injection. Ale i když se toto všechno implementuje správně, stejně to neznamená že se nenajdou nějaká jiná zadní vrátka, třeba v důsledku chyby administrátora :D

Upozorníme vás na články, které by vám neměly uniknout (maximálně 2x týdně).