Autor Zpráva
visionic
Profil *
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
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 *
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 *
Ten priklad jsem psal z hlavy. Mam escapovani a vselijake ochrany co jsem nacetl.
visionic
Profil *
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
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 *
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 *
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
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 *
v tom radku jsem mel php odradkovani, sam ale nevim jak se tam dostalu, mozna jsem zavadil o hotkey.

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: