Edit 2017/11/09:Nezapomeňte se podívat na odpověď od O Jones.
Za prvé, MD5 není nejlepší hašovací metoda, kterou byste pro tento účel mohli použít, zkuste sha256 nebo sha512
To znamená, že umožňuje použít hash('sha256')
místo md5()
reprezentovat hashovací část procesu.
Když poprvé vytvoříte uživatelské jméno a heslo, zahašujete nezpracované heslo trochou soli (do každého hesla se přidá několik náhodných znaků navíc, aby bylo delší/silnější).
Z formuláře pro vytvoření uživatele by to mohlo vypadat nějak takto:
$escapedName = mysql_real_escape_string($_POST['name']); # use whatever escaping function your db requires this is very important.
$escapedPW = mysql_real_escape_string($_POST['password']);
# generate a random salt to use for this account
$salt = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM));
$saltedPW = $escapedPW . $salt;
$hashedPW = hash('sha256', $saltedPW);
$query = "insert into user (name, password, salt) values ('$escapedName', '$hashedPW', '$salt'); ";
Po přihlášení to bude vypadat nějak takto:
$escapedName = mysql_real_escape_string($_POST['name']);
$escapedPW = mysql_real_escape_string($_POST['password']);
$saltQuery = "select salt from user where name = '$escapedName';";
$result = mysql_query($saltQuery);
# you'll want some error handling in production code :)
# see http://php.net/manual/en/function.mysql-query.php Example #2 for the general error handling template
$row = mysql_fetch_assoc($result);
$salt = $row['salt'];
$saltedPW = $escapedPW . $salt;
$hashedPW = hash('sha256', $saltedPW);
$query = "select * from user where name = '$escapedName' and password = '$hashedPW'; ";
# if nonzero query return then successful login