用戶註冊、密碼重置、API Token 生成等場景都需要高質量隨機字符串。本文對比三種主流算法,從底層原理到代碼實現,助你根據安全等級選擇最佳方案。
chr() 轉換為對應字符function create_password($pw_length = 8) {
$randpwd = '';
for ($i = 0; $i < $pw_length; $i++) {
$randpwd .= chr(mt_rand(33, 126));
}
return $randpwd;
}
// 調用示例
echo create_password(6); // 輸出如:#K9$mP
mt_rand() 非加密安全,不適用於高安全場景(如加密密鑰)mt_rand() 隨機索引抽取字符function generate_password($length = 8) {
// 可根據安全策略自定義字符池
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_[]{}<>~`+=,.;:/?|';
$password = '';
for ($i = 0; $i < $length; $i++) {
// 兩種等效寫法,數組訪問略快於 substr
$password .= $chars[mt_rand(0, strlen($chars) - 1)];
}
return $password;
}
array_rand() 一次性隨機選取多個鍵名function generate_password_v3($length = 8) {
$chars = array_merge(
range('a', 'z'),
range('A', 'Z'),
range('0', '9'),
str_split('!@#$%^&*()-_[]{}<>~`+=,.;:/?|')
);
$keys = array_rand($chars, $length);
$password = '';
foreach ($keys as $key) {
$password .= $chars[$key];
}
return $password;
}
array_rand() 在大數組性能略遜於方法二array_rand() 不再打亂順序,需額外 shuffle() 確保隨機性PHP 7+ 提供 random_int()、random_bytes() 等加密安全隨機函數。高安全場景(密碼重置 Token、API 金鑰)必須替換 mt_rand():
function secure_password($length = 16) {
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_[]{}<>~`+=,.;:/?|';
$bytes = random_bytes($length);
$password = '';
for ($i = 0; $i < $length; $i++) {
$password .= $chars[$bytes[$i] % strlen($chars)];
}
return $password;
}
| 場景 | 推薦方法 | 關鍵理由 |
|---|---|---|
| 一般業務密碼、臨時 Token | 方法二 | 可控字符集、性能均衡、維護簡單 |
| 高安全金鑰、加密鹽值 | CSPRNG 版本 | 抗預測攻擊,符合合規要求 |
| 純數字/字母驗證碼 | 方法一(調整範圍) | 代碼最精簡 |