Autor | Zpráva | ||
---|---|---|---|
joe Profil |
#1 · Zasláno: 20. 2. 2009, 20:16:56
Teď jsem nakouknul na stránku http://php.vrana.cz/slozitost-hesel.php a rád bych, kdyby mi to někdo trošku vysvětlil, jestli to půjde (záměrně píšu sem, protože tam se na nové komentáře příliš nereaguje) :-)
Na průměrném dnešním počítači trvá vypočtení hašů všech řetězců sestavených z malých písmen o délce 5 znaků pouhých 20 sekund. Zhruba stejně dlouho zabere vypočítání všech hašů sestavených z číslic a malých a velkých písmen o délce 4 znaky. Za jednu sekundu lze tedy v PHP bez jakékoliv optimalizace ověřit kolem půl miliónu hašů. ... Pro alespoň základní bezpečnost hesla je nutné po uživatelích chtít heslo délky nejméně 7 znaků sestavené z číslic a malých a velkých písmen (jeho odhalení by na jednom počítači trvalo průměrně 40 dní). - z webu. Proč píše, že je třeba po uživatelích chtít heslo dlouhé alespoň 7 znaků - pro delší dobu na jeho zjištění, když můžu napsat $userPassword = "pes"; $password = md5("-KoůÓ5bš°~1" . $userPassword . "@šířc81ABspr@!-)") Tak přece udělám heslo dost složité nebo ne? |
||
Majkl578 Profil |
#2 · Zasláno: 20. 2. 2009, 20:29:39
co dvojite sifrovani? osobne pouzivam v prvni fazi sha512 a pote sha256
|
||
imploder Profil |
#3 · Zasláno: 20. 2. 2009, 20:31:19
joe
To je pravda, takhle se heslo "solí" právě aby nebylo dohledatelné v tabulkách. I když kdyby útočníci udělali tabulku hashů pro všechny slova v původní tabulce takhle osolené (museli by ji přegenerovat), tak by jim pak na takové heslo fungovala. Sůl (tj. to, co k tomu přidáváš) prý může být veřejná a může být i konstantní, takže se s touhle možností zřejmě moc nepočítá, že by si s tím někdo dal takovou práci. Vlastně generování tabulky hashů pro všechny kombinace znaků do určité délky zabere stejnou dobu, jako metoda zmíněná v tom článku, tj. brute-force attack. Lepší je logicky mít sůl proměnnou, třeba jako sůl použít jméno uživatele, aby nemohli vygenerovat tabulku obsahující hashe hesel všech uživatelů, ale vždycky jenom jednoho. |
||
imploder Profil |
#4 · Zasláno: 20. 2. 2009, 20:35:20
Majkl578
„co dvojite sifrovani? osobne pouzivam v prvni fazi sha512 a pote sha256“ Pak se útočník podívá do zdrojáku, zjistí, že to tak máš, a prostě při zkoušení bude šifrovat oběma - tak, jak to děláš ty. |
||
SwimX Profil |
#5 · Zasláno: 20. 2. 2009, 20:37:45
imploder
„Pak se útočník podívá do zdrojáku“ jak se mu to povede? |
||
joe Profil |
#6 · Zasláno: 20. 2. 2009, 20:47:04
imploder
Jasně, ale když útočník nebude znát salt, pak původní heslo určitě nerozluští. Resp. nějaká šance by tam byla, ale třeba si do té doby uživatel změní heslo :) Dobré by bylo uložit někde ten salt jako proměnnou v souboru a ten mít úplně někde jinde - pokud to tedy server umožňuje. „Pak se útočník podívá do zdrojáku“ Pak si taky rovnou může do zdrojáku napsat, aby mu to všechny hesla posílalo malem jako plain text, když k tomu bude mít oprávnění. A většinou pokud někdo chcce uživatelovo heslo, tak chce přímo jeho heslo a ne nějaký kolizní řetězec. Takže si nemyslím, že je nutné chtít po uživateli dlouhá hesla, je to na nich. |
||
SwimX Profil |
#7 · Zasláno: 20. 2. 2009, 20:50:31
když se bude solit uživatelským jménem (nebo něčím lepším - náhodným řetězcem ukládaným do db) přidávaným někam (třeba za třetí písmenko hesla - nebo náhodně a místo ukládat do db) - je to sice děsně složitá možná až čuňačina, ale prolomit todle bude asi vcelku nemožné
|
||
joe Profil |
#8 · Zasláno: 20. 2. 2009, 20:53:01
SwimX
No já si myslím, hlavně když bude mít třeba tak 8 speciálních znaků... |
||
imploder Profil |
#9 · Zasláno: 20. 2. 2009, 20:54:07
SwimX
Zdrojáky můžou být tajné, ale předpokládal jsem, že nebudou. Obecně pokud se má nějaké šifrování používat, tak nemá být založené na utajení postupu (taková kryptografická zásada). U šifrovacího algoritmu dostupného veřejně je jasné, že se nedá spoléhat na jeho utajení. Podobně když se bude stejná aplikace používat na víc místech a má se nějak šířit. Taky se dá spoléhat na to, že do databáze se nikdo nepovolaný nedostane ani se nezmocní její zálohy a nezíská z ní tak hesla. Potom můžou být hesla uložená nezašifrovaná. Ty postupy prolamování předpokládají, že se útočník k uloženým heslům v databázi nějak dostane. Jinak by mohl zkoušet leda postupným zkoušením se přihlásit s různými hesly - to by trvalo strašně dlouho a hlavně by se na to přišlo a dostal by ban. |
||
Joker Profil |
#10 · Zasláno: 20. 2. 2009, 21:04:07
Jé, zrovna jsem napsal takový dlouhý příspěvek k tématu v jiném vlákně :-)
Položím dotaz i tady: Víte někdo, jak funguje to vyhledávání kolizí pro MD5? Dá se "spočítat" jen jedna (pořád ta samá) kolize, nebo se dá vyhledávat více kolizí? Dají se vyhledávat i kolize podle nějakých parametrů (třeba kolize začínající/končící nějakým řetězcem, nějaké délky apod.)? Každopádně podle mě je dostatečný i solený MD5 hash- oproti prostému MD5 to vidím jako dramatické zvýšení bezpečnosti. 1. Útočník musí kromě hashe znát i sůl. Asi spíš malá komplikace (když uvážím, že hash získá nejspíš z databáze, takže nejspíš získá i sůl), ale přesto komplikace. 2. Krom hashe a soli musí útočník znát i způsob, jakým se kombinují. To zjistí leda ve zdrojáku, takže už musí získávat informace nejméně ze dvou různých míst. 3. Vyhledání "jakékoliv" kolize je útočníkovi k ničemu, potřebuje najít kolizi, obsahující konkrétní znaky (sůl) na určitých místech v řetězci (většinou na začátku nebo na konci, ale algoritmus skládání může být i jiný) |
||
imploder Profil |
#11 · Zasláno: 20. 2. 2009, 21:26:57
Joker
„3. Vyhledání "jakékoliv" kolize je útočníkovi k ničemu, potřebuje najít kolizi, obsahující konkrétní znaky (sůl) na určitých místech v řetězci (většinou na začátku nebo na konci, ale algoritmus skládání může být i jiný)“ To je dobrý nápad - kontrolovat kromě shody hashů i shodu soli, takže heslo musí nejen sedět na daný hash, ale i obsahovat na správných místech používanou sůl. |
||
joe Profil |
#12 · Zasláno: 20. 2. 2009, 21:33:32
Joker
Jak funguje nevím, za půl roku budu chytřejší a pak se ozvu :-) ad 3. S tím moc nesouhlasim, pokud to bylo bráno tak, že nahlédl už do kódu, pak mu to práci vůbec neztíží, pokud bude hledat kolizní řetězec pro konkrétního uživatele. |
||
srigi Profil |
#13 · Zasláno: 20. 2. 2009, 22:24:57
imploder
„Zdrojáky můžou být tajné, ale předpokládal jsem, že nebudou. Obecně pokud se má nějaké šifrování používat, tak nemá být založené na utajení postupu (taková kryptografická zásada). U šifrovacího algoritmu dostupného veřejně je jasné, že se nedá spoléhat na jeho utajení. Podobně když se bude stejná aplikace používat na víc místech a má se nějak šířit.“ Joker „Útočník musí kromě hashe znát i sůl. Asi spíš malá komplikace (když uvážím, že hash získá nejspíš z databáze, takže nejspíš získá i sůl), ale přesto komplikace.“ Chybna uvaha. Tak ako je chybne si sol ukladat do DB. Sol musi byt ulozena na inom mieste ako v DB! Totizto, ak sa utocnik dostane k obsahu DB (napr. pomocou SQL inj.) a sol je v PHP skripte, nezmoze nic - nema sa ako ku hodnote SALT dostat. Jedine, ze by bola derava aplikacia a on mohom na server nahrat napr. PHP shell. Ale v takom pripade R.I.P. webmaster. |
||
Joker Profil |
#14 · Zasláno: 20. 2. 2009, 23:34:08
imploder
To je dobrý nápad - kontrolovat kromě shody hashů i shodu soli Shodu soli netřeba samostatně kontrolovat- Kontrola hesla přeci probíhá: Vezmu uživatelův vstup, přidám sůl, udělám MD5 a kouknu, jestli to sedí s databází. Už samotný ten postup zaručuje, že ta sůl ve vstupním řetězci bude na správném místě ;-) joe ad 3. S tím moc nesouhlasim, pokud to bylo bráno tak, že nahlédl už do kódu, pak mu to práci vůbec neztíží, pokud bude hledat kolizní řetězec pro konkrétního uživatele. Podle mě mu to naopak ztíží práci dost zásadně. A znalost kódu mu vůbec nepomůže. Vycházím z toho, že najít kolizní řetězec například začínající "qwe" a končící "rty" je daleko složitější, než najít libovolný kolizní řetězec. Zároveň vycházím z toho, že útočníkovi se nepodařilo narušit samotný kód aplikace (SQL/script injection třeba)- protože pak už nic nepomůže, libovolný bezpečnostní mechanismus může útočník jednoduše vyřadit (například sice nezná heslo, ale prostě vsune do databázového dotazu ověřujícího uživatele ono známé: OR 1=1'--). srigi Sol musi byt ulozena na inom mieste ako v DB! Pak je ale zas jiný problém: bude dost těžké mít pro každého uživatele jinou sůl. A stejná sůl pro všechny zruší jeden pozitivní efekt, o kterém se tu zatím nemluvilo: Totiž pokud každému uživateli vygeneruju jeho vlastní sůl, nejdou v databázi pak identifikovat uživatelé se stejnými hesly (mají sice stejné heslo, ale různou sůl, takže výsledný hash je různý). To znemožní útok jiného typu: Útočník zjistí, jak získat údaje z databáze. Založí si pár účtů s "očekávatelnými" hesly (třeba "heslo", "12345" a podobně). V databázi je pak schopný najít uživatele, kteří mají některé z hesel, která použil (mají stejný hash hesla jako nějaký z útočníkových účtů) a jejich účty nabourat. A i když útočník má heslo i sůl, pořád ještě nemá algoritmus, jakým se to skládá dohromady. Buď si ho tipne, nebo stejně potřebuje nakouknout do kódu. |
||
joe Profil |
#15 · Zasláno: 21. 2. 2009, 00:28:22
Joker
Pokud útočník bude znát ten hash uložený v db pod sloupečkem heslo a dostane se ke skriptu a uvidí sůl a vidí jakým způsobem se zpracovává, pak může provést ten brute force útok stejným způsobem, jako se provádí zahashování hesla a nebude to ničemu platné. Asi to bylo myšleno jako hledání kolizí, jestli se to dá nějak spočítat to nevím, ale pokud ano, tak jsem kecal :-) srigi Asi pravda, jenom tam akorát zabírá zbytečně místo. Joker „Pak je ale zas jiný problém: bude dost těžké mít pro každého uživatele jinou sůl.“ Ten může být třeba pět znaků z toho co vrátí md5($nick) |
||
Časová prodleva: 15 let
|
0