首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 產生隨機密碼函數:可自訂長度與字元集的安全實作

     編輯:PHP 相關知識

提供一個彈性、安全的隨機密碼產生函數,支援自訂長度範圍、字元集,並使用密碼學安全隨機數來源。

函數實作

<?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";
?>

安全重點

  • random_int():PHP 7+ 提供的 CSPRNG(密碼學安全偽隨機數產生器),優於 rand()/mt_rand()。
  • 字元集去混淆:移除 0/O、1/l/I、8/B 等易誤讀字元,提升人工抄寫正確率。
  • 長度建議:一般帳號 ≥12 碼;高敏感系統 ≥16 碼;配合密碼管理器可用 20+ 碼。
  • 不可預測:避免使用時間、PID、使用者輸入作為種子。

進階:符合 NIST 800-63B 規範

<?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;
}
?>

將此函數納入專案共用庫,統一密碼產生標準,提升帳號安全基線。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved