@Nemanja,
pa ako samo radis md5 od passworda, prilikom proboja baze na serveru (recimo da se veoooma retko desava, ali se desava, pogotovo na jeftinijim shared hostinzima) ako dodjes do baze, mozes videti md5 pasworda svih usera. Nemoraju uvek hakeri da izvrse upad, znaju to biti i ljudi koji imaju neki nivo pristupa bazi, iz bilokog razloga, bilo dampu baze, bilo da dobiju email dumpa baze, neki buduci developeri, testeri, klijenti ili sta ti ja znam. Sto nije toliko strasno i ocigledno, ali se moze relativno lako reverse-engineeringom doci do izvorne sifre (jedan od manjih sajtova koji to radi passcracking.com, a postoji jos puno, da ne trazim sad).
Znaci md5('a') je uvek '0cc175b9c0f1b6a831c399e269772661' i tako dalje...
E sad, prava problematika. Prosecan korisnik koristi datume, imena ili neke ocigledne reci kao sifre, koje se lako mogu naci u bazi nekog od ovih sajtova. Takodje, vecina korisnika cesto koristi isti password za ostale sajtove, mail servere itd, a u istoj (provaljenoj) bazi 90% mozes naci i korisnikovu email adresu, pa eto radosti preuzimanja identiteta

Sad, dodatno komplikovanje se moze raditi na nekoliko nacina, meni najprostiji (a sa veeeelikim nivoom zastite) je dodavanje jos jednog polja recimo password_hash koji se koristi uz password polja. Princip rada je sledeci:
Code:
// ***** KREIRANJE KORISNIKA
//Uzmes neki random string, recimo sa datumima
$tmp = date('YmHdis') . 'avram' . '_secret'; // nebitno sta dodas, stvar jedino koliko ti je dosadno u trenutku :)
$passwordHash=md5($tmp); // vrednost dodatnog `password_hash` polja
//nakon toga, originalni password se edituje dovoljno da bude gotovo nemoguc za pronaci u nekoj od postojecih baza, ili da ne bude smislen ukoliko se i provali, ovde ne ide nista random
$password = md5('avramfd213' . $passwordFromPost. '12fds21dsavram' . $passwordHash);
Tako ubacen korisnik u bazu u polju `password` ne sadrzi ni pribliznu vrednost svoje unete sifre (dump pred md5 i videces sta je ustvari u tom polju). U polju `password_hash` takodje ne stoje podatci koji su ikako vezani sa sifrom korisnika. Cak i ako se dodje do tvog koda, opet se nikako ne moze naslutiti niti kod okrenuti da se povrati sifra (zato se uvek hash pravi kao random). Moze se provaliti recimo kako se ulogovati (ako i to cak moze), inace, to je to.
Provera da li je korisnikova sifra ispravna (prilikom redovnog logovanja na sajt) se vrsi:
Code:
//izvuci iz baze hash i password, radi provere
$passwordHashFromDb = $db['password_hash];
$passwordValueFromDb = $db['password'];
//provera gore pomenutog kriptovanja sa trenutnom vrednoscu u bazi
if (md5('avramfd213' . $passwordFromPost. '12fds21dsavram' . $passwordHashFromDb) == $passwordValueFromDb){
// Sifra se poklapa sa kombincijom hasha i passworda iz baze, uloguj korisnika
Sad, jedino sto ovaj metod zaista zasticuje je ustvari kradja sifara, taj ko je dosao do tvoje baze, moze haos da napravi aplikaciji (naravno, ako provali sa privilegijama editovanja baze), ali ne moze doci do nijedne prave sifre korisnika

S'obzirom da sam ja jako paranoican sto se sigurnosti oupsteno tice, uvek koristim nesto slicno ovome za sifre. Ako jos neko ima ideju oko logovanja uopste, neka pise slobodno.
Ovo sam ustvari video kod flyLord-a, a sad odakle njemu, to samo on zna
