Mám následující problém:
Chtěl bych nechat uživatele se registrovat (to není problém) a přihlašovat se (to taky není problém). Ten problém tkví v něčem jiném - rád bych nějak zabezpečil ta uživatelská hesla. Četl jsem o SaltedHashi (Interval.cz), ale nevím, jak to provést na WZ, pokud to samozřejmě jde.
Takže když to shrnu, jsou tu dvě otázky:
1) Jak zabezpečit ta hesla?
2) A jde to vůbec na WZ?
Předem díky, Shippy
tak ty hesla ukládej zašifrovaný funkcí crypt() a máš to..
md5 je také velice používaná asymetrická (dokonce jednostranná) metoda šifrování... v praxi celkem používaná, od 7 heslovaných znaků prakticky velice zdlouhavě prolomitelná.
Shippy: crypt() je prave ten salted hash, a je tudiz lepsi.
Ad bod 2: Ano
Shippy: crypt() vyrabi prave ten salted hash, a je tudiz lepsi.
Ad bod 2: Ano
Takže ve chvíli, kdy se u mě někdo pokusí zaregistrovat - před odesláním do databáze použiju něco jako
$heslo=crypt(heslo);
?
A když se někdo pokusí přihlásit, tak udělám s tím heslem, které se ověřuje ($q="SELECT * FROM users WHERE login='$login' AND heslo='$heslo'";), to samé? Tj. že ještě před zavoláním mysql_query() zakryptuju funkcí crypt() to heslo?
Omlouvám se, mám malou představivost a žádnou zkušenost. Díky vám ty vaše zkušenosti :-)
Počkat musíš ošetřit aby před přihlášením se heslo zacryptovalo
Použít se dá i funkce SQL password, takže pak kontroluješ jestli uživatele přihlásíš např. takhle:
SELECT * FROM uzivatele WHERE (jmeno='$jmeno' AND heslo=password('$heslo'))
ALe crypt hází pokaždé jinou hodnotu stejného řetězce ne ?
Samozrejme ze ne. crypt() i md5() musi na ten samy vstupni retezec vzdycky vratit ten samy vystupni retezec. Jinak by to nebyly funkce na kryptovani retzece, ale spis na jeho znehodnoceni.
Mno já co si pamatuju tak mi to přesně tohle dělalo, crypt .. pokaždý jiný .. mno to je fuk asi bug
Mike: to je zcela korektni. Pokud nespecifikujes salt, php ho nadone vygeneruje. Algoritmus hashe je saltem ovlivnen. Pouzijes-li vystup cryptu() jako salt pro crypt() puvodniho retezce, dostanes ten samy vystup, jako salt. Je to trochu zmateny na prvni pohled, ale na ten druhej je to o dost propracovanejsi hashovani.
iirc, crypt() pouziva jeho systemovou implementaci, tudiz muze na ruznych platformach generovat ruzne vysledky. byt tebou bych pouzil neco prenositelnejsiho - sha1(), md5(), ...
pripadne crypt() a specifikovat mu metodu, co ma puzit, samozrejme :-)
A můžu se zeptat, jak se specifikuje ta metoda? V oboru zabezpečování jsem naprosto mimo.
On systems where the crypt() function supports multiple encryption types, the following constants are set to 0 or 1 depending on whether the given type is available:
*
CRYPT_STD_DES - Standard DES-based encryption with a two character salt
*
CRYPT_EXT_DES - Extended DES-based encryption with a nine character salt
*
CRYPT_MD5 - MD5 encryption with a twelve character salt starting with $1$
*
CRYPT_BLOWFISH - Blowfish encryption with a sixteen character salt starting with $2$ or $2a$