Edytuj 2017/11/09:Koniecznie zapoznaj się z odpowiedzią O Jonesa.
Po pierwsze MD5 nie jest najlepszą metodą haszowania, której możesz użyć do tego celu sha256 lub sha512
To powiedziawszy, użyjmy hash('sha256')
zamiast md5()
do reprezentowania haszującej części procesu.
Kiedy po raz pierwszy utworzysz nazwę użytkownika i hasło, zahasz surowe hasło z odrobiną soli (do każdego hasła dodawane są losowe dodatkowe znaki, aby były dłuższe/silniejsze).
Może wyglądać mniej więcej tak w formularzu tworzenia użytkownika:
$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'); ";
Wtedy po zalogowaniu będzie wyglądać mniej więcej tak:
$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