Autor | Zpráva | ||
---|---|---|---|
dymi Profil |
#1 · Zasláno: 12. 10. 2013, 10:15:00
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 |
#2 · Zasláno: 12. 10. 2013, 10:18:34
Takže zadané heslo zahesujes stejne jako pri registraci a hashe porovnáš.
|
||
Radek9 Profil |
#3 · Zasláno: 12. 10. 2013, 10:25:37
dymi:
„zároveň má po každé ten hash jinou podobu“ Co to používáš za hash, prosím tě? |
||
margin Profil * |
#4 · Zasláno: 12. 10. 2013, 10:26:37
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 |
#5 · Zasláno: 12. 10. 2013, 10:44:41
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 |
#6 · Zasláno: 12. 10. 2013, 10:48:03
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 |
#8 · Zasláno: 12. 10. 2013, 11:20:58
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 |
#9 · Zasláno: 12. 10. 2013, 11:28:24
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 |
#10 · Zasláno: 12. 10. 2013, 11:42:20
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 |
#12 · Zasláno: 12. 10. 2013, 11:50:27
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; cra>cker tedy může zkusit milion pokusů za sekundu. Výpočet crypt třeba trvá 1 milisekundu; cra>cker stihne za sekundu jen tisíc pokusů. Čísla jsem jen nastřílel od boku. V mém případě prece není cra>ck sprosté slovo. |
||
Amunak Profil |
#13 · Zasláno: 12. 10. 2013, 11:58:08
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 |
#14 · Zasláno: 12. 10. 2013, 12:11:49
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á;-) |
||
Časová prodleva: 11 let
|
0