Přihlášení se změnou hesla

Potřeboval bych sehnat script kterej by dovoloval přihlašenému uživately změnit heslo. díky
Dejme tomu, že ten uživatel bude mít svůj login a heslo uložený v DB. Takže si na stránku dáš formulář:

<input type="text" name="login">
<input type="password" name="pass">

... , kde si nejdřív (i když bude přihlášenej) ověříš, jestli tyto dva údaje skutečně v databázi existujou, a potom dáš:

<input type="password" name="new_pass1">
<input type="password" name="new_pass2">

(jedno na nové heslo a druhý na ověření správnosti prvního nového hesla) a celý tohle odešleš skriptu, kterej nejdřív zkontroluje tu první podmínku:

<?
if(mysql_num_rows(mysql_query("select id from tabulka where login like '$login' and pass like '$pass'")) != 0):
//tabulka bude mít minimálně sloupce id, login a pass

//a pak zjistíš, jestli obě nová hesla jsou shodná
if($_POST["new_pass1"] == $_POST["new_pass2"]):

mysql_query("update tabulka set pass = '".$_POST["$new_pass1"]."' where login like '$login' and pass like '$pass'");

endif;
endif;
?>


... nevím, jestli jsem tam někde neudělal chybu. Samozřejmě, že vše můžeš hashovat md5() a vypisovat i chybové hlášky.
Na hashovani lze doporucit crypt()
Díky za odpověď ale jsem úplnej amatér v php i v databázi. Nemohl bys mi to prosím napsat podroběji.
<HTML>Nesnasim slovickareni a tak se nebudu zminovat ze crypt nic nehashuje ale cryptuje soli ;)</HTML>
Richard: hash = jednosmerne sifrovani. Dela crypt() snad neco jinyho? AFAIK crypt() muze pouzivat i md5, je-li na OS k dispozici. A ze md5 hashuje, o tom snad uz nepochybujes... Tolik slovickareni
<HTML>>hash = jednosmerne sifrovani.
hash neni sifrovani ale otisk retezce, to je zakladni rozdil, to ze crypt umi md5 na osoleni nic neznamena

nemuzes srovnavat md5 a crypt, pri spravnem zakladnim uziti obou funkci zjistis zasadni rozdil mezi cryptovanim a hashovanim...

u crypt() vezmes heslo, pouzijes na nej crypt a ulozis ho..
vznikne napr: $1$9e..cR..$2VGfqVcnyQnwX6YzlklIS. (puvodem toho je "ahoj")
pak kdyz heslo overujes pouzijes puvodni retezec ("ahoj") a ulozene cryptovane heslo pouzijes jako salt, pri shode je vysledkem opet ulozeny salt....
viz priklad z manualu:

$password = crypt("My1sTpassword"); // let salt be generated
if (crypt($user_input, $password) == $password) {
echo "Password verified!";
}

.. v pripade ze ti nekdo ziska ulozeny zacryptovany retezec je mu k nicemu jelikoz pri pouziti standardni soli (dle nastaveni serveru) je vysledek pokazde jiny a NELZE z nej tedy ziskat puvodni retezec

zatimco po hashovani ti vysledny hash zjisti kdokoliv pres bruteforce mod.
navic obsahuje jen znaky A-Z a-z 0-9</HTML>
>> hash neni sifrovani ale otisk retezce

Jakej je rozdil mezi otiskem a jednosmernou sifrou? Ja to fakticky nevim...
<HTML>presne takovy jako mezi crypt() a md5()</HTML>
odltačok sa nedá previesť späť na pôvodné heslo (aspoň sa o to pokúšal navrhovateľ algoritmu)
šifrovanie je predurčené (a pokiaľ nieje MS, tak aj funguje) na zašifrovanie vstupných dát a spätné rozkódovanie (kľúč nemusí byť na obe operácie ten istý, čo je aj výhoda PGP)
odltačok sa nedá previesť späť na pôvodné heslo (aspoň sa o to pokúšal navrhovateľ algoritmu)
šifrovanie je predurčené (a pokiaľ nieje MS, tak aj funguje) na zašifrovanie vstupných dát a spätné rozkódovanie (kľúč nemusí byť na obe operácie ten istý, čo je aj výhoda PGP)
<HTML>neda, stejne jako zacryptovany retezec, jenomze md5 se da porovnavam generovanim retezce metodou bruteforce ... u cryptu to je nemozne (pri pojeti co pouziti to jiny vysledek)</HTML>
>> u cryptu to je nemozne

pokud zakryptovanej retezec pouziju jako salt, bude jen jediny vysledek...
všetko sa dá, preto sa tomu hovorí BFA
if !(nedá, nemožné, nejde, nikdy) {Človek}