隨機密碼生成是用戶註冊、密碼重置、API Token、臨時授權碼等場景的高頻需求。本文對比五種主流演算法:ASCII 碼隨機、字符集索引、陣列隨機鍵、時間哈希截取、洗牌插入關鍵字,從熵值、效能、可讀性、安全性四維度分析,給出生產環境選型建議。
function create_password_v2(int $length = 8): string {
$chars = 'abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ23456789!@#$%^&*';
$pwd = '';
$max = strlen($chars) - 1;
for ($i = 0; $i < $length; $i++) {
$pwd .= $chars[mt_rand(0, $max)]; // 陣列訪問比 substr 快
}
return $pwd;
}
l/1/I/O/0)log2(72^8) ≈ 49.3 bits
function create_password_v4(int $length = 8): string {
return substr(md5(microtime(true)), 0, $length);
}
0-9a-f (16 個)log2(16^8) = 32 bits,極低
function bench(callable $fn, int $iterations = 100000): float {
$start = microtime(true);
for ($i = 0; $i < $iterations; $i++) $fn(6);
return microtime(true) - $start;
}
echo "v1 ASCII: " . bench('create_password_v1') . "s\n"; // ~0.095s
echo "v2 字符集: " . bench('create_password_v2') . "s\n"; // ~0.092s
echo "v3 array_rand: " . bench('create_password_v3') . "s\n"; // ~0.175s
echo "v4 MD5: " . bench('create_password_v4') . "s\n"; // ~0.034s (最快但最不安全)
echo "v5 洗牌: " . bench('create_password_v5') . "s\n"; // ~0.068s (最快安全方案)
str_shuffle 替代多次 mt_rand$chars[mt_rand()] 比 substr 略快| 函數 | 隨機來源 | 加密安全 | 適用場景 |
|---|---|---|---|
rand() | 舊式 LCG | ❌ 可預測 | 棄用 |
mt_rand() | Mersenne Twister | ❌ 觀測 624 次輸出可破解狀態 | 非安全場景 (遊戲、測試) |
random_int() | OS CSPRNG (/dev/urandom, getrandom) | ✅ 加密安全 | 密碼、Token、金鑰 |
random_bytes() | OS CSPRNG | ✅ 加密安全 | 二進制金鑰、IV、Salt |
openssl_random_pseudo_bytes() | OpenSSL RNG | ✅ 加密安全 | PHP 7 前替代方案 |
| 場景 | 推薦演算法 | 關鍵要求 | |
| 用戶初始密碼/重置密碼 | generate_secure_password() (v5 安全版) | 加密安全、可讀性、符合密碼策略 | |
| API Token / Access Key | generate_api_token() (Base64URL) | 高熵、URL-safe、無特殊字符編碼問題 | |
| 一次性驗證碼 (SMS/Email) | random_int(100000, 999999) | 6 位數字、加密安全、用戶易輸入 | |
| 臨時檔案名/Session ID | bin2hex(random_bytes(16)) | 唯一性、無碰撞、十六進制安全 | |
| 測試資料/模擬數據 | v2 字符集索引法 | 可讀性、可重現 (可設種子)、效能 | |
| 記憶友好密碼 (語音傳遞) | v5 洗牌 + 關鍵字 | 含可讀單詞、可控熵、效能佳 |
隨機密碼生成看似簡單,實則關係帳號體系安全根基。堅持「加密安全隨機源 + 可配置字符集 + 策略合規驗證」三原則,拒絕
mt_rand/time()/md5()等弱隨機來源,是專業開發者的底線。