« 1 2 »
Autor Zpráva
miskith
Profil
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
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
Radek9:
Vím že hash je jednosměrná šifra, ale co já vím, tak některé se podařilo prolomit...
Joker
Profil
miskith:
Nechci podceňovat, ale dokážete navrhnout nějakou novou a přitom bezpečnou hashovací funkci?
miskith
Profil
Joker:
No... Myslím si, že s pomocí googlu a nějaké té kombinace by to mohlo jít.
DoubleThink
Profil *
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
Má PHP i nějaký kvalitní hash na vyhledávací tabulku (tj. ne takový, ze kterého vyleze 64 znaků, ale číslo)?
Joker
Profil
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
V PHP5 jde vypsat výsledek MD5 jako surový binární řetězec pomocí funkce hash():
hash('md5', $retezec, true);
Nox
Profil
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
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
hmm...napadlo mě udělat teda kombinaci hashů. Není toto blbé?:
$password = md5(sha1($password).sha1(md5($password)));
Joker
Profil
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 *
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
DoubleThink:
Hmm...ale krom toho že místo saltu tam budu mít hashované heslo to není špatné ne?
Tomashek
Profil
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
Já posledně použil něco takového:
hash('sha1', hash('sha256', $string . SALT));
imploder
Profil
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
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
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
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
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
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
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
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
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
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
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 *
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
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.
« 1 2 »

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: