crypt() 是 PHP 內建的單向雜湊函式,支援多種演算法。本文實測常見的 Standard DES、Extended DES、MD5、Blowfish 四種模式,並說明適用場景與安全性差異。
<?php
$password = 'hello world';
echo "=== crypt() 演算法支援度檢測 ===\n\n";
if (CRYPT_STD_DES === 1) {
echo "Standard DES: " . crypt($password) . "\n";
} else {
echo "Standard DES: 不支援\n";
}
if (CRYPT_EXT_DES === 1) {
echo "Extended DES: " . crypt($password) . "\n";
} else {
echo "Extended DES: 不支援\n";
}
if (CRYPT_MD5 === 1) {
echo "MD5: " . crypt($password) . "\n";
} else {
echo "MD5: 不支援\n";
}
if (CRYPT_BLOWFISH === 1) {
echo "Blowfish: " . crypt($password) . "\n";
} else {
echo "Blowfish: 不支援\n";
}
Standard DES: heXXxxxxxxxx
Extended DES: _J9..XXxxxxxxxxxxx
MD5: $1$XXxxxxxx$XXXXXXXXXXXXXXXXXXXX
Blowfish: $2y$10$XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
| 演算法 | 鹽值格式 | 長度 | 安全性 | 建議用途 |
|---|---|---|---|---|
| Standard DES | 2 字元 | 13 字元 | 極低(1970 年代) | ❌ 棄用 |
| Extended DES | 9 字元(_ 開頭) | 20 字元 | 低 | ❌ 棄用 |
| MD5 | $1$ + 8 字元 | 34 字元 | 中(已知碰撞) | ⚠️ 遷移中 |
| Blowfish | $2y$ + cost + 22 字元 | 60 字元 | 高(可調成本) | ✅ 推薦 |
crypt() 直接雜湊不加鹽值,實務上嚴禁用於密碼儲存。PHP 5.5+ 請改用 password_hash() / password_verify(),內建 BCrypt、Argon2i/Argon2id,自動處理鹽值與成本參數。
<?php
// 註冊:雜湊密碼
$hash = password_hash($_POST['password'], PASSWORD_BCRYPT, ['cost' => 12]);
// 儲存 $hash 到資料庫...
// 登入:驗證密碼
if (password_verify($_POST['password'], $hashFromDb)) {
// 成功
}
// 需要時重新雜湊(如成本參數變更)
if (password_needs_rehash($hashFromDb, PASSWORD_BCRYPT, ['cost' => 14])) {
$newHash = password_hash($_POST['password'], PASSWORD_BCRYPT, ['cost' => 14]);
// 更新資料庫
}
crypt() 適合學習雜湊原理、相容舊系統,不適合新專案密碼儲存。password_hash(),零配置、最佳安全實踐內建。