Chỉnh sửa ngày 11 tháng 11 năm 2017:Hãy chắc chắn xem câu trả lời từ O Jones.
Trước hết MD5 không phải là phương pháp băm tốt nhất mà bạn có thể sử dụng cho việc này, hãy thử sha256 hoặc sha512
Điều đó nói rằng hãy sử dụng hash('sha256')
thay vì md5()
đại diện cho phần băm của quy trình.
Khi bạn tạo tên người dùng và mật khẩu lần đầu tiên, bạn sẽ băm mật khẩu thô với một số muối (một số ký tự bổ sung ngẫu nhiên được thêm vào mỗi mật khẩu để làm cho chúng dài hơn / mạnh hơn).
Có thể trông giống như thế này xuất hiện từ biểu mẫu người dùng tạo:
$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'); ";
Sau đó, khi đăng nhập, nó sẽ trông giống như sau:
$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