資料安全是 Web 開發核心環節。本文系統介紹 PHP 內建加密函數特點、適用場景與避坑指南,並推薦業界標準的密碼存儲方案。
$hash = md5('123456'); // e10adc3949ba59abbe56e057f20f883e
// 自動鹽值 + Blowfish (bcrypt 前身)
$hash = crypt('mypassword'); // $2a$07$usesomesillystringfore2uDLvp1Ii2e./U9C8sBjqp8I90dH6hi
// 驗證
if (crypt('mypassword', $hash) === $hash) { echo 'verified'; }
$1$ MD5, $2a$ Blowfish, $5$ SHA-256, $6$ SHA-512)$hash = sha1('123456'); // 7c4a8d09ca3762af61e59520943dc26494f8941b
$encoded = urlencode('https://example.com/道'); // http%3A%2F%2Fexample.com%2F%E9%81%93
$decoded = urldecode($encoded);
+,非字母數字轉 %XXmyUrlEncode()$encoded = base64_encode('CraryPrimitiveMan'); // Q3JhcnlQcmltaXRpdmVNYW4=
$decoded = base64_decode($encoded);
如 cmd5.com 等僅是彩虹表查詢,**無法逆向算法**。若密碼簡單(如純數字 6 位),MD5/SHA1 秒破。對抗策略:
md5(sha1(md5($pwd)))),無實質安全增益// PHP 5.5+ 內建推薦
$hash = password_hash('my super cool password', PASSWORD_BCRYPT, ['cost' => 12]);
// 驗證
if (password_verify('user input', $hash)) { /* 成功 */ }
或使用經驗證的 phpass 庫(兼容舊版本):
require 'PasswordHash.php';
$hasher = new PasswordHash(8, false); // cost=8, 不可移植(更安全)
$hash = $hasher->HashPassword('password');
$ok = $hasher->CheckPassword('password', $hash);
| 場景 | 推薦方案 |
|---|---|
| 用戶密碼 | password_hash() (bcrypt/Argon2) 或 phpass |
| API 簽名、完整性校驗 | HMAC-SHA256 (hash_hmac()) |
| URL 參數、表單傳輸 | urlencode() / rawurlencode() |
| 二進制文本化 | base64_encode() |
| 舊系統維護 | 漸進遷移至 password_hash() |
安全無小事,選對工具、用對姿勢,才能守住最後一道防線。