Autor Zpráva
dymi
Profil
Zdravím, začal jsem se nudit tak jsem si řekl že začnu psát nějakou webovou aplikaci. Takže jsem začal registrací a následným přihlášením uživatele na stránku. Samozřejmě chci aby uživ. heslo bylo uložené v zahashované podobě. Při ukládání nemám problém ale jak to mám poté udělat při loginu? abych se shodná hesla shodovali v určité podobě přičemž víme že jedno to heslo je zahashované a zároveň má po každé ten hash jinou podobu. Ptám se tedy Vás, jak mám při této situaci postupovat? abych zahashované heslo dostal do normálního formátu(při tom co zadával uživatel) pro následné porovnání.
Rfilip
Profil
Takže zadané heslo zahesujes stejne jako pri registraci a hashe porovnáš.
Radek9
Profil
dymi:
zároveň má po každé ten hash jinou podobu
Co to používáš za hash, prosím tě?
margin
Profil *
Jak píše Rfilip, případně doporučuji hesla hashovat se solí, která bude pro každého uživatele odlišná , tou může být třebas čas registrace uživatele, tím zabráníš tomu, aby několik uživatelů se stejnými hesly (oblíbené jsou 123456, nburs123, ...) měli stejný a hash hesla.
dymi
Profil
Takže vždy stačí abych před načtením hodil např. md5($_POST['nejakyheslo']) a pokud i při ukládání používám md5($_POST['zasheslo']) tak se budou shodovat? mě to nefunguje. a to hashuji vždy výstup a pak ukládám proměnnou jako například ($pass = md5($_POST['zadaneheslo']) )
Enko
Profil
PHP od verze 5.5 nabízí již vestavěné vhodné funkce. viz http://www.php.net/manual/en/book.password.php . JPokud nemáš možnost používat verzi 5.5 a máš minimálně verzi 5.3.7 tak používej crypt(). Více třeba tady Šifrování/hashování hesel: algoritmus blowfish, nové funkce
dymi
Profil
Mě to prostě nefunguje:


při ukládání
$Password = crypt($_POST['Password']);

$query_insert_user = "INSERT INTO `members` ( `Username`, `Email`, `Password`, `Activation`) VALUES ( '$name', '$Email', '$Password', '$activation')";

načítání
$Password = crypt($_POST['Password']);
 $query_check_credentials = "SELECT * FROM members WHERE (Email='$Email' AND Password='$Password' ) AND Activation IS NULL";

není problém v tom že se porovnájí přes dotaz do db?


Podotýkým že při heslech v normální podobě je to funkční
juriad
Profil
Vypiš si ten dotaz ($query_check_credentials) před tím, než ho provedeš; třeba některá z proměnných obsahuje něco, co neočekáváš.
V dotazu jinak problém nevidím. Není náhodou problém s podmínkou Activation IS NULL? Zkus ji vyhodit.
dymi
Profil
juriad:
podmínku s activací jsem odstranil, vypsal co obsahuje dotaz a vše mi přijde v pořádku(email se vypisuje v cajku a heslo v hashy také akorát po každé jinak). Jsem původně myslel že na vrácení toho HASHe do původního formátu musí být nějaký speciální funkce protože to pokaždý vyplivne jinej hash na stejný heslo tak mi to přišlo logický
Alphard
Profil
Ano, je to složitější, takovýto hash je vždy jiný. Používejte např. sha1() a nekomplikujte si na začátek život.
Amunak
Profil
juriad, dymi:
crypt(), pokud nedostane jako druhý parametr salt, si nějaký vygeneruje, takže je ten hash pokaždý jiný. Pro porovnání je potřeba prvně vytáhnout ten původní hash hesla a celý ho dosadit právě do druhého parametru té funkce. Hned první příklad v manuálu to pěkně ilustruje.
juriad
Profil
dymi:
Hash by se neměl lišit mezi dvěma zavoláními funkce crypt. Když si přečteš dokumentaci, zjistíš, že pokud nezadáš druhý parametr, PHP ti vygeneruje nějakou sůl. Zadej druhý parametr funkce crypt. Inspiruj se příklady z dokumentace.
Jak píše margin, každý uživatel by měl používat jinou sůl, ztížíš tak „zpětný výpočet“ hesla v případě úniku hashů.

Výhodou algoritmů, které používá crypt spočívá v tom, že výpočet hashe je časově náročnější; ale pořád dostatečně rychlý pro běžné použití.
Výpočet sha1 třeba trvá 1 mikrosekundu; cracker tedy může zkusit milion pokusů za sekundu.
Výpočet crypt třeba trvá 1 milisekundu; cracker stihne za sekundu jen tisíc pokusů.
Čísla jsem jen nastřílel od boku.

V mém případě prece není crack sprosté slovo.
Amunak
Profil
juriad:
Když heslo poprvé hashuje, druhý parametr zadávat nemusí (skoro bych řekl, že je to i nežádoucí) - ať si PHP vygeneruje sůl jakou chce. Zadávat se to pak musí jen při kontrole.
dymi
Profil
Joooo děkuju za pomoc, hlavně vím v čem je chyba. Vše jsem zhruba používal správně, jen jsem měl deb*l v DB nastaveno málo znaků na heslo, tudíž proto mi to nefungovalo. Moc se omlouvám že jsem na to nepřišel dřív ale nebýt Vaší pomoci tak na to nepřijdu tak rychle. Děkuji moc za POMOC :)
Enko
Profil
Alphard:
Používejte např. sha1() a nekomplikujte si na začátek život.
Podle mě je toto špatná logika. Nic těžkého na výše zmiňovaných funkcích není. A s tímto přístupem, bez urážky, se nikdy nenaučí dělat věci lépe a pořádně. Vždy jde jen o rozdělení úkolů krok za krokem a v případě, že něco nefunguje, naučit se odhalit příčinu. Místo tebou navrhovaného řešení, radši to udělej s jinou funkcí, která je v dnešní době na toto použití již archaická;-)

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: