| 場景 | 用途 | 注意事項 |
| 檔案完整性驗證 | 下載軟體對比官方公布 MD5,確認未被竄改/損壞 | 需從官方管道取得正確雜湊值 |
| 密碼儲存(舊做法) | 資料庫存 MD5(password) 而非明文 | 現已不安全,請見下節 |
| 快取鍵/去重 | 以內容 MD5 作為 key,快速比對 | 碰撞機率極低但非零 |
| 簽章驗證 | API 參數加鹽後 MD5 簽章,防竄改 | 需搭配 HTTPS、時間戳、Nonce |
為什麼 MD5 不適合儲存密碼?
- 速度太快:現代 GPU 每秒可計算數十億次 MD5,暴力破解極易。
- 無鹽值:相同密碼產生相同雜湊,彩虹表可秒破。
- 碰撞攻擊:已找到碰撞對,理論上可構造不同輸入產生相同 MD5。
正確密碼雜湊:bcrypt / Argon2
<?php
// PHP 5.5+ 內建
$hash = password_hash($password, PASSWORD_DEFAULT); // 目前預設 bcrypt
// 或指定 Argon2id (PHP 7.2+)
$hash = password_hash($password, PASSWORD_ARGON2ID);
// 驗證
if (password_verify($password, $hash)) {
// 成功
}
// 重新雜湊(當演算法升級或 cost 變更)
if (password_needs_rehash($hash, PASSWORD_DEFAULT)) {
$new_hash = password_hash($password, PASSWORD_DEFAULT);
// 更新資料庫
}
MD5 仍可接受的用途
- 非安全性關鍵的快取鍵、ETag、檔案去重索引。
- 舊系統相容性遷移期(配合鹽值、雙層雜湊),但應規劃移除。
- 教學示範雜湊概念。
線上工具與指令
# Linux/Mac
md5sum file.txt
echo -n "string" | md5sum
# PHP
md5('string'); // 32 字元十六進位
md5('string', true); // 16 位元組二進位
hash('md5', 'string'); // 通用介面
結語
MD5 是經典雜湊函式,適合完整性驗證、非安全索引;嚴禁用於密碼儲存。現代專案請全面改用 password_hash() / password_verify()(bcrypt/Argon2),並啟用 HTTPS、雙因子驗證等纵深防禦。
- 上一篇文章: 心理測驗網站付費功能實作:金流串接完整指南
- 下一篇文章: PHP 進階專案練習建議:從 CMS、API 到微服務的成長階梯
Copyright ©
程式碼之家 All Rights Reserved