« 1 2 »
Autor Zpráva
lenkali
Profil *
Dobrý večer,

zahashovala jsem si heslo pomoci MD5,
ulozila jsem ho do databaze a ted bych jej
chtela odhashovat zpet na citelny tvar..

priklad

vložím své heslo: kocicka
ulozi se mi diky MD5: 12fv35efv45es54

a kdyz chci vypsat z databaze heslo, tak mi to vypise prave to: 12fv35efv45es54
ale ja chci dostat to : kocicka

prosim vas o radu
xy125
Profil
To nejde
BetaCam
Profil
lenkali
To nelze md5 je jednosměrná hashovací funkce.
svadla
Profil
md5 hash je jen jednosmerny, takze to zpet nedostanes, ale existuji databaze md5 hashu, zkus google
suky
Profil
lenkali
Md5 neni sifrovani, lae hash a ten uz nemuzes dostat zpet. Urcite tak zamyslis pro zapomenute heslo, ale to udelej tak ze vytvoris nove, to posles na email a zaheshujes do db.
Nox
Profil
lenkali
Toto nejde, md5 na toto není stavěné, lze leda porovnávat, jestli například vámi
zadané heslo při přihlašování (md5kované) se shoduje s md5kovanou "kocicka"

na možnost zpětného rozkódování slouží šifovací funkce (třeba crypt,aes_encrypt...)
svadla
Profil
Nox
"na možnost zpětného rozkódování slouží šifovací funkce (třeba crypt,aes_encrypt...)"
(jen doplneni)
ale to by to heslo muselo byt zasifrovane, ne zahashovane md5
lenkali
Profil *
Aha, děkuji Vám moc za rady, nevěděla jsem si rady jestli to vůbec jde nebo nejde, děkuji
lenkali
Profil *
A proč se to teda dělá? Když někdo se dostane do databáze tak přečte stejně chaotické znaky 12fv35efv45es54 jako kocicka a kdyz bude zadavat 1000x heslo a bude se snazit dostat do systemu, tak stejne ty hesla co zadava se hashuji MD5kou na tvar, ktery hlida program a kdyz se strefi, tak vyhral ten zlodej...

hmm

tak proc se to hashuje?
Nox
Profil
svadla
Někdo se vždy najde...
Myslel sem to tak, že pokud bude chtít něco zaheslovat tak, aby to pak mohla zase dešifrovat,
tak má použít uvedených funkcí

To nalezení není tak jednoduché...a taky proč povolovat 1000 pokusů, že?
Hashuje se to pro to, aby když si zloduch přečte řetězec, ho nemohl užít jako heslo,
protože v databázi už je hashované, kdežto uživatel musí zadat nehashované, aby to prošlo
Mastodont
Profil
lenkali
Protože ta šance, že se při odhadu hesla trefí, je mnohem menší než 1:1000.
BetaCam
Profil
lenkali
A proč se to teda dělá?

Je to krytí hesla. Pokud ne nekdo nabourá do databáze znal by hesla všech uživatelů. Takhle zná jen Hashe a bude muset hledat heslo nebo kolize hashů. Další věc je, že ani samotnej správce DB by neměl znát hesla uživatelů.
lenkali
Profil *
Tak to mi jde hlava kolem, děkuju všem za vysvětlení
Joker
Profil
Ještě doplním:
lenkali
A proč se to teda dělá?
Dělá se to právě proto, že nejde to, co je předmětem tohoto vlákna :-) Tzn. můžu ověřit správnost hesla (resp. s vysokou pravděpodobností. Existují totiž různé řetězce dávající stejný hash, tomu se říká kolize) a přitom samotné heslo nemusím ani znát, ani mít nikde uložené.
Kdyby šlo z hashe dostat zpátky to původní heslo, bude celý hash k ničemu, protože to už můžu rovnou do databáze uložit přímo to heslo.

Když někdo se dostane do databáze tak přečte stejně chaotické znaky 12fv35efv45es54 jako kocicka
...no a následuje právě ta pointa: pokud bude v databázi kocicka, já nějakým způsobem získám výpis databáze, přečtu si kocicka, na stránce zadám kocicka a jsem tam.
Pokud se do databáze bude ukládat hash, například MD5, já nějakým způsobem získám výpis z databáze, přečtu si 955db0b81ef1989b4a4dfeae8061a9a6 a zadám... jenže co? Přímo ten řetězec zadat nemůžu, protože skript z něj udělá MD5, čímž se to změní, a teprve potom to porovná a odmítne přístup. A algoritmus, jak z hashe získat zpětně heslo, neexistuje (neměl by existovat).

Konkrétně to v tom příkladu by teda nabouratelné bylo, jelikož jsem zvolil hodně profláknutý hash :-) To se dá i zpaměti: pokud máte v nějaké české databázi MD5 hesel a nějaký řádek je 955db..., heslo je "heslo" :-)
lenkali
Profil *
Už to chápu, to je chytré :o)
děkuji Jokere a všem za dlouhou odpověď
BetaCam
Profil
Joker
Konkrétně to v tom příkladu by teda nabouratelné bylo, jelikož jsem zvolil hodně profláknutý hash :-) To se dá i zpaměti: pokud máte v nějaké české databázi MD5 hesel a nějaký řádek je 955db..., heslo je "heslo" :-)

Jistě, ale další věc je, že vetšina lidí používá navíc salt, který ještě na aplikační úrovni kombinuje různými způsoby s heslem samotným a až poté generuje výsledný hash. Takže narazit na takto profláknutý hash mi v dnešní době přijde už opravdu málo pravděpodobné než třeba před pár lety. ( Tím slovnem "kombinuje" myslím opravdu nějakou složitější kombinaci než přidání salt na konec či začátek hesla)
DoubleThink
Profil *
že vetšina lidí používá navíc salt
Nemyslím si, že většina.

Tím slovnem "kombinuje" myslím opravdu nějakou složitější kombinaci než přidání salt na konec či začátek hesla
"Složitější" salt zpravidla není potřeba. Brute-force nebo Rainbow table útok většinou končí nalezením (jiného) kolizního klíče - z něj salt už pochopitelně separovat nejde i kdyby to byl jenom přidaný řetězec.
Joker
Profil
BetaCam
Přesně tak. Používání tzv. solených hashů je bezpečnější, nicméně to ubírá část zábavy správce, jako třeba použití příkazu:
SELECT heslo, COUNT(id) AS pocet FROM uzivatele GROUP BY heslo ORDER BY pocet DESC
...neboli žebříček popularity hesel :-) Pro zajímavost, jednou jsem to zkoušel a ze zhruba 600 záznamů to které jsem čekal bylo opravdu na prvním místě a mělo ho 20 lidí.

Jinak ale pokud znám algoritmus (tj. kam se připojuje sůl), dá se najít uživatel s "profláknutým" heslem taky jen pomocí čtení z databáze, například:
SELECT id, username FROM uzivatele WHERE MD5('heslo'+sul) LIKE heslo
...ale už se nemůžu "nabourat" na konkrétního uživatele, jen umím najít ty, kteří mají triviální heslo. Je to jen o trochu efektivnější metoda, než vytáhnout si seznam jmen uživatelů a na každého z nich se zkoušet přihlásit heslem "heslo" tak dlouho, až to u některého vyjde.
BetaCam
Profil
DoubleThink
"Složitější" salt zpravidla není potřeba. Brute-force nebo Rainbow table útok většinou končí nalezením (jiného) kolizního klíče - z něj salt už pochopitelně separovat nejde i kdyby to byl jenom přidaný řetězec.

Jistě, ale pokud má někdo výpis DB tak má hash i salt. (Tedy pokud se salt ukládá v DB) Z toho je každému jasné, že když je v DB salt bude se někde k heslu připojovat. Pokud je útočník schopný se dostat do DB asi by mu nemělo dělat problém vzít si hash a salt z DB a naprogramovat si program, který bude využívat nějaký slovník a na konec každého slova bude přidán salt udělán hash a ten posléze porovnán s hashem z DB. Pak je jedno jestli útočník nasel správné heslo nebo kolizní řetězec. Právě pridání saltu na konec hesla by byla podle mě první volba útočníka a přidání na začátek hesla jako druhá.

Když ovšem někdo bude přidávat salt k heslu například podle "vzorce" :

První tři znaky ze SALT před poslední dva znaky hesla.
Dva předposlední znaky ze SALT za první znak hesla.

Pak bude muset útočník mimo výpisu z DB bud vymyslet podle jakého klíče se salt přidává k heslu a poté hledat kolize a nebo se nějakým způsobem dostat do kódu aplikace, která se o skládání saltu s heslem stará. Tak jako tak je to pro něj další znepříjemnění práce.
Joker
Profil
BetaCam
Z toho je každému jasné, že když je v DB salt bude se někde k heslu připojovat.
Je možné buď sůl nějak "nenápadně" pojmenovat, nebo místo soli používat nějaký jiný sloupec, například ID.
Ovšem je to "security through obscurity" (ale to je používání soli podle nějakého algoritmu taky).
DoubleThink
Profil *
Jistě, ale pokud má někdo výpis DB tak má hash i salt.
To nemá. Salt se přidává před hashováním. Musel by získat zdrojový kód přihlašovací aplikace. A v takovém případě je úplně šumák, jak řetězec zamícháš. Vždy půjde ve stejném duchu upravit brute-force rutinu.

Salt je obrana hlavně proti rainbow tables (a to za všech podmínek - pro tvůj salt je nikdo nebude mít předgenerované).
A sekundárně jako obrana proti externímu bruteforce na samostatně získaných hash hodnotách (zpravidla SQL injekcí).

Z této perspektivy tedy stačí přidat, odebrat nebo změnit jediný znak hesla a salt bude spolehlivě plnit svou funkci.
BetaCam
Profil
DoubleThink

To nemá. Salt se přidává před hashováním. Musel by získat zdrojový kód přihlašovací aplikace. A v takovém případě je úplně šumák, jak řetězec zamícháš. Vždy půjde ve stejném duchu upravit brute-force rutinu.

Salt se vetšinou dává každému uživatelovi unikátní z důvodu krytí stejných hesel. Většinou se také salt ukládá do DB přímo k userovi, protože salt řetězec je v podstatě k ničemu, když nevíš jak se používá. Až aplikace sním nakládá tak jak má. Pokud se použije jako salt společný řetězec strácíš tím schopnost saltu krejt stejná hesla.
Polarkac
Profil *
Tak jen chci doplnit ze MD5 neni uz davno tak bezpecne a po par kliknuti v googlu se da nalizt desifrator viz. tady http://www.md5decrypter.com/
Bubák
Profil
Polarkac
Slavný "dešifrátor" funguje tak, že zadáš něco "zakryptovat" a dešifrátor si to zapamatuje, uloží do databáze. Takže d7fc64d87110285f8a132998e944542c zatím neumí, i když je to jen na pět písmen, bez diakritiky a malými písmeny.
Zprovanované heslo 955db0b81ef1989b4a4dfeae8061a9a6 samozřejmě "umí".
Davex
Profil
Bubák
Jiný nástroj davno umí.
yellow
Profil
<?
$hledame="d7fc64d87110285f8a132998e944542c";
$k0 = 1;
$k1 = 1;
$k2 = 1;
$k3 = 1;
$k4 = 1;
$k5 = 1;

do {
if ($k1==1) $k1a="a";
if ($k1==2) $k1a="b";
if ($k1==3) $k1a="c";
if ($k1==4) $k1a="d";
if ($k1==5) $k1a="e";
if ($k1==6) $k1a="f";
if ($k1==7) $k1a="g";
if ($k1==8) $k1a="h";
if ($k1==9) $k1a="i";
if ($k1==10) $k1a="j";
if ($k1==11) $k1a="k";
if ($k1==12) $k1a="l";
if ($k1==13) $k1a="m";
if ($k1==14) $k1a="n";
if ($k1==15) $k1a="o";
if ($k1==16) $k1a="p";
if ($k1==17) $k1a="q";
if ($k1==18) $k1a="r";
if ($k1==19) $k1a="s";
if ($k1==20) $k1a="t";
if ($k1==21) $k1a="u";
if ($k1==22) $k1a="v";
if ($k1==23) $k1a="w";
if ($k1==24) $k1a="x";
if ($k1==25) $k1a="y";
if ($k1==26) $k1a="z";

if ($k2==1) $k2a="a";
if ($k2==2) $k2a="b";
if ($k2==3) $k2a="c";
if ($k2==4) $k2a="d";
if ($k2==5) $k2a="e";
if ($k2==6) $k2a="f";
if ($k2==7) $k2a="g";
if ($k2==8) $k2a="h";
if ($k2==9) $k2a="i";
if ($k2==10) $k2a="j";
if ($k2==11) $k2a="k";
if ($k2==12) $k2a="l";
if ($k2==13) $k2a="m";
if ($k2==14) $k2a="n";
if ($k2==15) $k2a="o";
if ($k2==16) $k2a="p";
if ($k2==17) $k2a="q";
if ($k2==18) $k2a="r";
if ($k2==19) $k2a="s";
if ($k2==20) $k2a="t";
if ($k2==21) $k2a="u";
if ($k2==22) $k2a="v";
if ($k2==23) $k2a="w";
if ($k2==24) $k2a="x";
if ($k2==25) $k2a="y";
if ($k2==26) $k2a="z";

if ($k3==1) $k3a="a";
if ($k3==2) $k3a="b";
if ($k3==3) $k3a="c";
if ($k3==4) $k3a="d";
if ($k3==5) $k3a="e";
if ($k3==6) $k3a="f";
if ($k3==7) $k3a="g";
if ($k3==8) $k3a="h";
if ($k3==9) $k3a="i";
if ($k3==10) $k3a="j";
if ($k3==11) $k3a="k";
if ($k3==12) $k3a="l";
if ($k3==13) $k3a="m";
if ($k3==14) $k3a="n";
if ($k3==15) $k3a="o";
if ($k3==16) $k3a="p";
if ($k3==17) $k3a="q";
if ($k3==18) $k3a="r";
if ($k3==19) $k3a="s";
if ($k3==20) $k3a="t";
if ($k3==21) $k3a="u";
if ($k3==22) $k3a="v";
if ($k3==23) $k3a="w";
if ($k3==24) $k3a="x";
if ($k3==25) $k3a="y";
if ($k3==26) $k3a="z";

if ($k4==1) $k4a="a";
if ($k4==2) $k4a="b";
if ($k4==3) $k4a="c";
if ($k4==4) $k4a="d";
if ($k4==5) $k4a="e";
if ($k4==6) $k4a="f";
if ($k4==7) $k4a="g";
if ($k4==8) $k4a="h";
if ($k4==9) $k4a="i";
if ($k4==10) $k4a="j";
if ($k4==11) $k4a="k";
if ($k4==12) $k4a="l";
if ($k4==13) $k4a="m";
if ($k4==14) $k4a="n";
if ($k4==15) $k4a="o";
if ($k4==16) $k4a="p";
if ($k4==17) $k4a="q";
if ($k4==18) $k4a="r";
if ($k4==19) $k4a="s";
if ($k4==20) $k4a="t";
if ($k4==21) $k4a="u";
if ($k4==22) $k4a="v";
if ($k4==23) $k4a="w";
if ($k4==24) $k4a="x";
if ($k4==25) $k4a="y";
if ($k4==26) $k4a="z";

if ($k5==1) $k5a="a";
if ($k5==2) $k5a="b";
if ($k5==3) $k5a="c";
if ($k5==4) $k5a="d";
if ($k5==5) $k5a="e";
if ($k5==6) $k5a="f";
if ($k5==7) $k5a="g";
if ($k5==8) $k5a="h";
if ($k5==9) $k5a="i";
if ($k5==10) $k5a="j";
if ($k5==11) $k5a="k";
if ($k5==12) $k5a="l";
if ($k5==13) $k5a="m";
if ($k5==14) $k5a="n";
if ($k5==15) $k5a="o";
if ($k5==16) $k5a="p";
if ($k5==17) $k5a="q";
if ($k5==18) $k5a="r";
if ($k5==19) $k5a="s";
if ($k5==20) $k5a="t";
if ($k5==21) $k5a="u";
if ($k5==22) $k5a="v";
if ($k5==23) $k5a="w";
if ($k5==24) $k5a="x";
if ($k5==25) $k5a="y";
if ($k5==26) $k5a="z";

$ven = $k1a;
$ven .= $k2a;
$ven .= $k3a;
$ven .= $k4a;
$ven .= $k5a;

$md5 = md5 ($ven);
if ($md5 == $hledame) echo $ven." je hledane heslo";

if($k1==26 and $k2==26 and $k3==26 and $k4==26 and $k5<27) $k5++;
if($k1==26 and $k2==26 and $k3==26 and $k4==26 and $k5==27) $k5=1;

if($k1==26 and $k2==26 and $k3==26 and $k4<27) $k4++;
if($k1==26 and $k2==26 and $k3==26 and $k4==27) $k4=1;

if($k1==26 and $k2==26 and $k3<27) $k3++;
if($k1==26 and $k2==26 and $k3==27) $k3=1;

if($k1==26 and $k2<27) $k2++;
if($k1==26 and $k2==27) $k2=1;

if($k1<27) $k1++;
if($k1==27) $k1=1;

$k0++;
}
while($k0<11881376);

?>
yellow
Profil
davno je hledane heslo

jsem neměl teď co dělat

jinak ten skript pracoval chvilku, nestopoval jsem to, ale určitě miň než 5 minut (sempron 1,5GHz)
to jen tak pro zajimavost
roberta
Profil
yellow
vyskúšaj zahashovať 20 znakové heslo a potom ho skús zistiť...
tiso
Profil
yellow - cykly nepoznáš, alebo si platený za počet riadkov kódu? Dalo s to napísať na 12 riadkov...
nightfish
Profil
tiso
cykly nepoznáš, alebo si platený za počet riadkov kódu? Dalo s to napísať na 12 riadkov...
třeba jen nezná kouzelnou funkci chr
« 1 2 »
Toto téma je uzamčeno. Odpověď nelze zaslat.

0