資料庫儲存明文密碼極度危險。MD5 將密碼單向雜湊為 32 字元十六進位字串,驗證時比對雜湊值,避免洩露原始密碼。
<?php
$pswd1 = md5("cenusdesign");
echo $pswd1; // fc60ec37d1c08d5b0fb67a8cd934d5ba
$pswd2 = md5("Cenusdesign"); // 大小寫不同
echo $pswd2; // 067577d9fc109c80538c81d6f02bd293 (完全不同)
?>
特性:雪崩效應,輸入微小變化導致輸出劇烈不同。
<?php
$password = $_POST['password'];
$hashed = md5($password); // 雜湊
// 儲存 $hashed 至資料庫
?>
<?php
$input_password = $_POST['password'];
$input_hashed = md5($input_password);
// 從資料庫查詢該用戶的雜湊密碼
$db_hashed = $row['password']; // 假設已查詢
if ($input_hashed === $db_hashed) {
echo "登入成功";
// 建立 Session...
} else {
echo "密碼錯誤";
}
?>
md5($salt . $password),每用戶唯一鹽值儲存於資料庫。password_hash()/password_verify()) 或 Argon2 (PHP 7.2+),內建鹽值、可調成本因子、抗暴力破解。<?php
// 註冊
$hash = password_hash($password, PASSWORD_DEFAULT); // 目前預設 bcrypt
// 儲存 $hash
// 登入驗證
if (password_verify($input_password, $db_hash)) {
echo "登入成功";
}
// 重新雜湊檢查 (演算法升級時)
if (password_needs_rehash($db_hash, PASSWORD_DEFAULT)) {
$new_hash = password_hash($input_password, PASSWORD_DEFAULT);
// 更新資料庫
}
?>
**結論**:教學用 MD5 可理解雜湊概念,**實務專案務必使用 password_hash()/password_verify()**。