Autor | Zpráva | ||
---|---|---|---|
miskith Profil |
#1 · Zasláno: 3. 2. 2010, 10:32:55 · Upravil/a: miskith
Napadla mě taková věc, ale chci se zeptat, jestli to není blbost a pak z toho nevznikla špatná věc. Chci se zeptat, jestli je lepší používat základní hash CMS, a to 2x md5 ( md5(md5($pass)) ) a nebo jestli bych měl lepší udělat následnou věc:
Sepsat si do souboru vlastní hash, který bych poté inkludoval a ten vlastní hash zašifrovat (Diskuse) , aby nikdo nevěděl jak ho hashuju. Šlo by mi o to, aby poté ani člověk co má přístup k souborům jen tak nezjistil nečí heslo. Co sem četl, tak md5 už byl rozluštěn a ten zašifrovaný soubor by se určitě taky dal, ale chci to prostě případným hackerů co nejvíce ztížit. Tak jaký je váš názor? Nechat 2x md5 nebo md5 a vlastní hash? PS: Vím že existují i jiné hashe, ale momentálně mě spíš zajímá co z těchto dvou variant byste spíš volili... |
||
Radek9 Profil |
#2 · Zasláno: 3. 2. 2010, 10:37:32 · Upravil/a: Radek9
miskith:
Hash je jednosměrná šifra, takže myslím, že ikdyž někdo uvidí kód, tak to nerozluští. Jinak, místo md5 spíše používejte sha1. Nevím, jak to bylo přesně uděláno, ale md5 se podařilo prolomit. |
||
miskith Profil |
#3 · Zasláno: 3. 2. 2010, 10:41:55
Radek9:
Vím že hash je jednosměrná šifra, ale co já vím, tak některé se podařilo prolomit... |
||
Joker Profil |
#4 · Zasláno: 3. 2. 2010, 11:10:45
miskith:
Nechci podceňovat, ale dokážete navrhnout nějakou novou a přitom bezpečnou hashovací funkci? |
||
miskith Profil |
#5 · Zasláno: 3. 2. 2010, 11:12:28
Joker:
No... Myslím si, že s pomocí googlu a nějaké té kombinace by to mohlo jít. |
||
DoubleThink Profil * |
#6 · Zasláno: 3. 2. 2010, 11:21:07
Bylo probíráno už několikrát - k hashům se zpravidla přidává tzv. salt:
• šifrování hesla • šifrováni • Sbohem, SQL injection? • Bezpečné uložení hesel do DB • md5, sha1 nebo oboje |
||
imploder Profil |
#7 · Zasláno: 3. 2. 2010, 12:39:51
Má PHP i nějaký kvalitní hash na vyhledávací tabulku (tj. ne takový, ze kterého vyleze 64 znaků, ale číslo)?
|
||
Joker Profil |
#8 · Zasláno: 3. 2. 2010, 12:53:27 · Upravil/a: Joker
imploder:
„tj. ne takový, ze kterého vyleze 64 znaků, ale číslo“ Výsledkem MD5 je číslo. Nebo respektive... výsledkem jakéhokoliv hashe je sekvence bitů a pak už záleží jen na softwaru, jestli to bude reprezentovat jako znaky nebo jako číslo. Nicméně MD5 hash se obvykle reprezentuje jako číslo (dodatek: 32-místné číslo v šestnáctkové soustavě). |
||
DJ Miky Profil |
#9 · Zasláno: 3. 2. 2010, 13:05:16
V PHP5 jde vypsat výsledek MD5 jako surový binární řetězec pomocí funkce hash():
hash('md5', $retezec, true); |
||
Nox Profil |
#10 · Zasláno: 3. 2. 2010, 13:13:42
miskith:
Viz Joker, SHA vyvíjí NSA a ikdyž sha0 a sha1 nejsou dokonalé, tak osobně bych se necítil na něco lepšího, použij třeba sha2 (sha512) s unikátním saltem a máš to |
||
AM_ Profil |
#11 · Zasláno: 3. 2. 2010, 14:22:40
Okolo prolomení MD5 se šíří hrubý omyl. MD5 nebylo prolomeno ve smyslu nalezení původního řetězce (tedy "dešifrování") rychlejším způsobem než zkoušením všech kombinací. Byl nalezen algoritmus, který pro daná data umí v relativně dobrém čase nalézt jiná data se stejným MD5 hashem. Toto je nešťastné, pokud MD5 chráníte nějaký "důvěryhodný" soubor (klient ověří, že soubor je pravý, tím, že má stejné MD5, jaké uvádí vydavatel); hacker může napsat škodlivý kód, který doplní tak, aby měl stejný MD5. Nicméně pro šifrování hesel toto nevadí, jediné, co to znamená, je, že pokud někdo zná Vaše heslo, může nalézt "alternativní" heslo, které bude mít stejný MD5.
|
||
miskith Profil |
#12 · Zasláno: 3. 2. 2010, 15:22:26
hmm...napadlo mě udělat teda kombinaci hashů. Není toto blbé?:
$password = md5(sha1($password).sha1(md5($password))); |
||
Joker Profil |
#13 · Zasláno: 3. 2. 2010, 15:27:22
AM:
„MD5 nebylo prolomeno ve smyslu nalezení původního řetězce (tedy "dešifrování") rychlejším způsobem než zkoušením všech kombinací.“ Poznámka: Nijak, ani zkoušením kombinací, nelze ze samotného hashe (bez dalších informací) zjistit původní řetězec, použitý jako vstup hashovací funkce. „Toto je nešťastné, pokud MD5 chráníte nějaký "důvěryhodný" soubor ... Nicméně pro šifrování hesel toto nevadí“ Za prvé to není "šifrování" hesel, za druhé to není pravda. Podle mého názoru vyhledání kolize je nebezpečnější pro heslo uložené jako jednoduchý (nesolený) hash, než pro ověřování souborů. K podstrčení škodlivého obsahu musím najít kolizní data se specifickými vlastnostmi: musí to být fungující soubor daného typu a musí obsahovat můj škodlivý kód. Naproti tomu při prolamování hesla uloženého prostým MD5 mi stačí najít libovolný kolizní řetězec. Samozřejmě v obou situacích existují další opatření, která útok ztíží, ale "v základu" je podle mě jednodušší útok na heslo, než podstrčení škodlivého kódu. „jediné, co to znamená, je, že pokud někdo zná Vaše heslo, může nalézt "alternativní" heslo, které bude mít stejný MD5.“ Není pravda. Znamená to to, že pokud někdo zjistí hash mého hesla (třeba se nějakým způsobem dostane k datům z databáze), může si vyrobit kolizní heslo a s ním se pak přihlásit k mému účtu. |
||
DoubleThink Profil * |
#14 · Zasláno: 3. 2. 2010, 15:50:42
miskith:
„hmm...napadlo mě udělat teda kombinaci hashů. Není toto blbé?:“ Je, stejnou práci odvede i přidání obyčejného saltu. |
||
miskith Profil |
#15 · Zasláno: 3. 2. 2010, 16:04:47
DoubleThink:
Hmm...ale krom toho že místo saltu tam budu mít hashované heslo to není špatné ne? |
||
Tomashek Profil |
#16 · Zasláno: 3. 2. 2010, 16:25:46
Ja používám tak, že to dám přes sha1(md5(heslo)) a to následně zkrátím na 32 znaků, takže to vypadá jako md5, ale přitom to není nic z toho.
|
||
Majkl578 Profil |
#17 · Zasláno: 3. 2. 2010, 16:34:18
Já posledně použil něco takového:
hash('sha1', hash('sha256', $string . SALT)); |
||
imploder Profil |
#18 · Zasláno: 3. 2. 2010, 17:32:01 · Upravil/a: imploder
Když útočník chce heslo konkrétního uživatele a sůl pro jednotlivé uživatele je mu známá, tak pro něj rozluštění hesla není problém, protože ví, co si musí předgenerovat. Vygeneruje si tabulku hashů všech možných hesel do nějaké délky nebo podle slovníku, akorát ke každému heslu přidá před zahashováním uživatelovu sůl. Pak si může vyhledat podle hashe heslo toho uživatele, jako by solené nebylo.
Joker, DJ Miky:: „Nebo respektive... výsledkem jakéhokoliv hashe je sekvence bitů a pak už záleží jen na softwaru, jestli to bude reprezentovat jako znaky nebo jako číslo.“ Na to právě narážím - s tak dlouhým řetězcem se jako s číslem nedá počítat. Bylo by to neuvěřitelně velké číslo. Ale když je to číslo, tak se dá udělat modulo (stejně by se dělalo, když je menší tabulka). $retezec = "bla"; /* A) získání čísla z řetězce vygenerovaného md5() */ $md5retez = md5($retezec); // hash do tabulky = nejnižší 4 bajty md5 čísla zapsaného v md5retez $tab_hash = hexdec(substr($md5retez, 24)); /* B) alternativní postup - z funkce hash() - na tohle nejde použít substr(), protože nezvládá čísla --- * (výsledek je stejný jako u A) */ $md5cislo = hash('md5', $retezec, true); // md5 hash je 16-bajtové big-endian číslo, vybereme nejnižší 4 bajty $exp = 3; // tj. 256^3 .. 256^0 $tab_hash = 0; for($i=16-($exp+1); $i<16 && $exp>=0; $i++, $exp--) { $tab_hash += ord($md5cislo[$i])*pow(256, $exp); } // $index = $tab_hash % $velikost_tabulky Takže obyčejná md5() funkce je na to nakonec vhodnější. |
||
AM_ Profil |
#19 · Zasláno: 3. 2. 2010, 17:34:39
Joker:
„Naproti tomu při prolamování hesla uloženého prostým MD5 mi stačí najít libovolný kolizní řetězec.“ Rád bych k tomuto slyšel vyjádření někoho, kdo ví něco více o kryptologii. Hledání kolizí, z toho, co vím (kamarád značně znalý v oboru IT security), znamená, že mám řetězec s daným hashem a k němu umím najít stejný řetězec s daným hashem, nikoli že z hashe samotného dokážu spočítat řetězec, který má tento hash. Nicméně nemůžu najít žádný důvěryhodný zdroj, takže pokud někdo víte, kde to ověřit, prosím :) |
||
Joker Profil |
#20 · Zasláno: 3. 2. 2010, 17:49:54
AM:
„Hledání kolizí, z toho, co vím (kamarád značně znalý v oboru IT security), znamená, že mám řetězec s daným hashem a k němu umím najít stejný řetězec s daným hashem, nikoli že z hashe samotného dokážu spočítat řetězec, který má tento hash.“ To je teda zamotaná věta :-) Vysvětlím názorně, co znamená hledání kolize: 1. Vím, že systém používá prostý md5 hash pro kontrolu hesla a nějak zjistím, že účet který mě zajímá má hash třeba 955db0b81ef1989b4a4dfeae8061a9a6. 2. Vezmu hash 955db0b81ef1989b4a4dfeae8061a9a6 a různými postupy se snažím najít kolizní řetězec 3. Zjistím, že vstup "heslo" generuje hash 955db0b81ef1989b4a4dfeae8061a9a6. Přitom nevím (a nikdy nezjistím), jestli "heslo" je skutečně to, co bylo použité k vytvoření hashe! Ale to mi může být jedno, protože mám kolizní řetězec. 4. Zadám kolizní řetězec ("heslo") jako přihlašovací heslo do systému. Přestože to nemusí být skutečné uživatelovo heslo, systém mě přihlásí. |
||
AM_ Profil |
#21 · Zasláno: 3. 2. 2010, 17:53:34
Joker:
„Vezmu hash 955db0b81ef1989b4a4dfeae8061a9a6 a různými postupy se snažím najít kolizní řetězec“ takové způsoby právě zatím neexistují. Hledání kolizí je něco jiného. |
||
Timy Profil |
#22 · Zasláno: 3. 2. 2010, 19:43:26
Jak říká AM, kolize jsou něco jiného. Rozlišují se dvě kolize, prvního a druhého řádu. Kolize prvního řádu je, že jsem schopný najít nějaké dva řetězce, které mají stejnou výslednou hash. Prolomení tohohle řádu asi moc nevadí z pohledu ukládání hesel, ale pro nějaké digitální podpisy apod. už je to velká díra. Konkrétní útoky založené na této koliznosti se dají někde najít, z hlavy si je nepamatuji. Kolize druhého řádu je, že mám předem daný řetězec a já jsem schopný k tomuto řetězci najít jiný řetězec, který má stejnou hash. Klímův algoritmus z roku 2006 umožňoval generovat kolize prvního řádu, viz například jeho vyjádření na Rootu. Jestli je možné v přijatelném čase generovat kolize druhého řádu teď nevím. Černé mraky se stahují už i nad SHA-1, která je teoreticky prolomena, a už se nesmí u nás používat pro certifikační služby. Ale bezpečnost při hashování hesel by to asi nemělo ovlivnit. Jestli chcete bezpečí, počkejte, až se Klímova nová hashovací funkce Blue Midnight Wish [PDF] stane SHA-3 standardem ;-).
|
||
AM_ Profil |
#23 · Zasláno: 3. 2. 2010, 19:48:36
Timy:
Díky, tohle jsem chtěl slyšet :) takže jsem měl pravdu. Na krátká hesla jsou na webu stejně rainbow tabulky, ale ty lze předgenerovat pro sebe"bezpečnější" hash. |
||
Joker Profil |
#24 · Zasláno: 3. 2. 2010, 20:00:57
AM, Timy:
„takové způsoby právě zatím neexistují. Hledání kolizí je něco jiného.“ Ale existují. Právě tohle dělá ten asi nejtriviálnější útok, hrubá síla. Anebo raibow tables. „Kolize druhého řádu je, že mám předem daný řetězec a já jsem schopný k tomuto řetězci najít jiný řetězec, který má stejnou hash.“ A to je přesně to, co demonstruje můj příspěvek. Mám předem daný řetězec (akorát nevím jaký přesně to je, protože útok na heslo založený na znalosti toho hesla by byl trochu trapný :-) ) a snažím se najít řetězec, který dává stejný hash. |
||
Timy Profil |
#25 · Zasláno: 3. 2. 2010, 20:04:41
AM:
Pravdu jsi měl, ale vyjádřil ses dost svérázně :-). „mám řetězec s daným hashem a k němu umím najít stejný řetězec s daným hashem“ Tam má být jiný. Dva stejné řetězce budou určitě mít stejnou hash :-). |
||
AM_ Profil |
#26 · Zasláno: 3. 2. 2010, 20:05:33 · Upravil/a: AM_
Joker:
„Ale existují. Právě tohle dělá ten asi nejtriviálnější útok, hrubá síla. Anebo raibow tables.“ Rainbow tables i brutal force můžeš aplikovat na sebebezpečnější hash, tomu neodolá nic, žeano. „Mám předem daný řetězec (akorát nevím jaký přesně to je)“ tak to pak není předem daný :) snad je to z Timyho příspěvku dost jasné, ne? Předem daný znamená: Znám : řetězec A, hash md5(A) Umím najít: řetězec B, md5(B)=md5(A) NIKOLI TOTO, takovýto algoritmus rychlejší než brutal-force znám není: znám: md5(A) (neznám A) umím najít: B, md5(B)=md5(A) [#25] Timy spíš sem se vyjádřil blbě, jasněže jiný, prostě jsem se přepsal :) |
||
Timy Profil |
#27 · Zasláno: 3. 2. 2010, 20:14:38
Joker:
„A to je přesně to, co demonstruje můj příspěvek.“ To je přesně to, co nedemonstruje. V tvém příkladě máš na vstupu algoritmu hash H a snažíš se k tomu najít nějaký řetězec S, pro který platí hash(S)=H. U kolize máš na vstupu řetězec S a na výstupu řetězec S', pro který platí hash(S)=hash(S'). Výsledkem pak jsou dva kolizní řetězce S != S'. Tedy z informace o tom, jak vypadá S vygeneruješ S'. Kdyby hledání kolizí bylo to, co popisuješ, tak by — vzhledem k tomu, že pro md5 je známý algoritmus hledání kolizí — tady Klíma vyhodil „původní“ řetězec a igigi by rozluštil 100 % hesel a ne jen 92 % ;-). |
||
Joker Profil |
#28 · Zasláno: 3. 2. 2010, 20:56:02
Timy:
OK, OK, zjevně s těmi termíny operuji poněkud volněji. Přesto myslím, že moje původní tvrzení je pravdivé. Na prolomení hesla mi stačí najít jakýkoliv kolizní řetězec (pokud "kolizní řetězce" říkám těm, které mají stejný hash). Pro podstrčení škodlivého kódu potřebuju najít nejen kolizi, ale zároveň ta kolize musí obsahovat na určitých místech určitá data- což nevím jak jde (na odkazované diskusi V. Klíma píše že nejde, ale to už je skoro 4 roky) |
||
DoubleThink Profil * |
#29 · Zasláno: 3. 2. 2010, 22:33:01
AM:
„Rainbow tables i brutal force můžeš aplikovat na sebebezpečnější hash, tomu neodolá nic, žeano.“ Ale časová náročnost zde roste exponenciálně k délce a parabolicky ke složitosti hesla. Delší a složitější hesla tak není možné hrubou silou zlomit a jejich hashe nebudou obsaženy v žádné rainbow tabulce. |
||
Timy Profil |
#30 · Zasláno: 3. 2. 2010, 22:42:15
DoubleThink:
Myslím, žes netrefil pointu AM_ova příspěvku. Šlo o to, že jakákoliv hashovací funkce nemůže být z principu odolná proti útoku hrubou silou nebo slovníkovému útoku. Hashovací funkce může být odolná proti těmto útokům jen při dodání dalších podmínek jako je třeba dostatečná délka vstupu nebo netriviální vstup. |
||
Téma pokračuje na další straně.
|
0