提供一個彈性、安全的隨機密碼產生函數,支援自訂長度範圍、字元集,並使用密碼學安全隨機數來源。
<?php
/**
* 產生隨機密碼
*
* @param int $minLength 最小長度
* @param int $maxLength 最大長度
* @param string $charset 可用字元集
* @return string 隨機密碼
*/
function genPassword(int $minLength = 12, int $maxLength = 16, string $charset = ''): string {
if ($charset === '') {
// 排除易混淆字元:0/O, 1/l/I, 8/B 等
$charset = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ23456789!@#$%^&*';
}
if ($minLength < 1) $minLength = 1;
if ($maxLength < $minLength) $maxLength = $minLength;
$length = random_int($minLength, $maxLength);
$maxIndex = strlen($charset) - 1;
$password = '';
for ($i = 0; $i < $length; $i++) {
$password .= $charset[random_int(0, $maxIndex)];
}
return $password;
}
// 使用範例
echo "預設密碼 (12-16 碼): " . genPassword() . "\n";
echo "短密碼 (8-10 碼): " . genPassword(8, 10) . "\n";
echo "純數字 6 碼: " . genPassword(6, 6, '0123456789') . "\n";
echo "高強度 20 碼: " . genPassword(20, 20, 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_+-=[]{}|;:,.<>?') . "\n";
?>
rand()/mt_rand()。<?php
function genNistPassword(int $length = 16): string {
// 至少包含:大寫、小寫、數字、特殊符號各一
$lower = 'abcdefghjkmnpqrstuvwxyz';
$upper = 'ABCDEFGHJKMNPQRSTUVWXYZ';
$digit = '23456789';
$special = '!@#$%^&*';
$all = $lower . $upper . $digit . $special;
$pwd = '';
$pwd .= $lower[random_int(0, strlen($lower)-1)];
$pwd .= $upper[random_int(0, strlen($upper)-1)];
$pwd .= $digit[random_int(0, strlen($digit)-1)];
$pwd .= $special[random_int(0, strlen($special)-1)];
for ($i = 4; $i < $length; $i++) {
$pwd .= $all[random_int(0, strlen($all)-1)];
}
// 打亂順序
$pwd = str_shuffle($pwd); // 注意:str_shuffle 非 CSPRNG,極高安全需求請自行實作 Fisher-Yates + random_int
return $pwd;
}
?>
將此函數納入專案共用庫,統一密碼產生標準,提升帳號安全基線。