Autor | Zpráva | ||
---|---|---|---|
visionic Profil * |
#1 · Zasláno: 16. 4. 2016, 14:30:22
Ahoj všem,
dozvěděl jsem se, že zakódování hesla pomocí md5, není vůbec bezpečné, tak jsem si načetl něco o crypt(). Samozřejmě chci uživatelům nabídnout co nejbezpečnější přístup a proto solení dělám automaticky, ale zde nastává problém při autorizaci uživatelů při hledání shody hesla a loginu z mysql. Dále jsem si načetl v manuálu jak toto řešit. Ale zde jsem našel, jak to řešit v samotném php a ne v mysql. Testování v php scriptu dopadlo dle očekávání správně a funkce na hledání shody cryptem funguje skvěle, ale jak toto aplikovat na mysql příkaz? Děkuji všem za rady. |
||
juriad Profil |
#2 · Zasláno: 16. 4. 2016, 14:39:04
Ideálně použij funkce password_hash a password_verify.
Při registraci použiješ tu první; tím se vygeneruje hash nejbezpečnějším dostupným algoritmem, který v sobě obsahuje už i náhodnou sůl. Pří přihlášení si vytáhneš z databáze hash uživatele podle jeho username a předáš ho spolu s heslem druhé funkci, která zkontroluje, zda hash odpovídá tomuto heslu. Tedy: databáze vrátí 0 záznamů - uživatelské jméno neexistuje databáze vrátí >1 záznam - někde máš chybu databáze vrátí jeden záznam: - a tento neprojde verifikací - chybné heslo, zaloguj chybu, počítej počet pokusů - a tento projde verifikací - platný login, poznamenej si někam |
||
visionic Profil * |
#3 · Zasláno: 16. 4. 2016, 15:41:34
Takhle mohu použít i crypt(), mě šlo o to, že jsem chtěl shodou mysql loginu a passu.
Něco tímto způsobem. "SELECT * FROM uživatelé WHERE login='" . $_POST['login'] . "' AND heslo=MD5('" . $_POST['heslo'] . "') LIMIT 1;" Samozřejmě pokud to nejde jinak, než tvým příkladem, nejzbevá než to předělat. |
||
Radek9 Profil |
visionic:
To se vzhledem k tomu náhodménu saltu prostě udělat nedá. Musíš vybrat hash se saltem z DB podle jména a až potom porovnávat hesla. Mimochodem, ten tvůj kód je strašně děravý, přečti si něco o SQL injection. ;-) |
||
visionic Profil * |
#5 · Zasláno: 16. 4. 2016, 17:14:58
Ten priklad jsem psal z hlavy. Mam escapovani a vselijake ochrany co jsem nacetl.
|
||
visionic Profil * |
#6 · Zasláno: 16. 4. 2016, 19:51:38
Jsem asi uplne blbej, ale kdyz to hashovane heslo vypisu z databaze tak verifikace neprobehne, ale kdyz ho zkopiruji pomoci ctrl+c a d8m ho tam natvrdo, verifikace probehne uspesne. WTF?
|
||
Fisir Profil |
#7 · Zasláno: 16. 4. 2016, 20:00:45
Reaguji na visionice:
A vypisuješ z databáze heslo zahashované funkcí password_hash() , že jo? Jestli funkci password_verify() předáváš ty původní v MD5, tak to fungovat nebude.
|
||
visionic Profil * |
#8 · Zasláno: 16. 4. 2016, 20:07:46
Postup co jsem udelal
Toto jsem vlozil do mysql: password_hash("mojetajneheslo", PASSWORD_DEFAULT); a ted delam toto: $hash = $row[heslo]; $pass = $_POST[heslo]; if (password_verify($pass, $hash)) { zalogujem; } else { vyhodime hlasku; } Upozornuji, ze jsem i zkousel echem vypsat $row[heslo] a opravdu to vyhodilo spravny string. Kdyz do variablu $hash vlozim to same z mysql, tak to funguje |
||
visionic Profil * |
#9 · Zasláno: 17. 4. 2016, 17:42:06
Takze chybu jsem objevil, docela sranda.
Do mysql se mi zahadnym zpusobem vklada mezera + radek a tim padem se hash nerovnal vysledku. Takovahla chyba me mohla napadnout hned zezacatku, ale pro ostatni, ktery to take nezkontrolovali, tak at se podivaj na sloupecek v mysql. |
||
Keeehi Profil |
#10 · Zasláno: 18. 4. 2016, 18:00:52
visionic:
„Do mysql se mi zahadnym zpusobem vklada mezera + radek a tim padem se hash nerovnal vysledku“ Já bych si tipnul, že to bude tím jak jsi to do ní kopíroval. |
||
visionic Profil * |
#11 · Zasláno: 18. 4. 2016, 19:09:34
v tom radku jsem mel php odradkovani, sam ale nevim jak se tam dostalu, mozna jsem zavadil o hotkey.
|
||
Časová prodleva: 9 let
|
0