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

PHP 密码生成器类:可配置长度、数量、字符规则的批量生成实战

     編輯:PHP 綜合知識

封装一个 GeneratePassword 类,支持自定义密码长度(4-50)、批量数量(1-100)、字符规则(字母大小写、数字、特殊字符的可选/必选/强制大小写)、自定义特殊字符集。适用于批量创建账号、生成临时凭证、API Key 等场景。

类核心代码

 1, 'number' => 1, 'special' => 1]; // 1可选 2必选 3必选小写 4必选大写 5大小写必选
    private $_length = 8;
    private $_num = 1;
    private $_special = '!@#$%^&*()_+=-';

    public function __construct($length = 8, $num = 1, $rule = [], $special = '') {
        if (isset($length) && is_numeric($length) && $length >= 4 && $length <= 50) $this->_length = $length;
        if (isset($num) && is_numeric($num) && $num > 0 && $num <= 100) $this->_num = $num;
        if (isset($special) && is_string($special) && $special !== '') $this->_special = $special;
        if ($rule) {
            $t = [];
            if (isset($rule['letter']) && in_array($rule['letter'], [1,2,3,4,5])) $t['letter'] = $rule['letter'];
            if (isset($rule['number']) && in_array($rule['number'], [1,2])) $t['number'] = $rule['number'];
            if (isset($rule['special']) && in_array($rule['special'], [1,2])) $t['special'] = $rule['special'];
            if ($t) $this->_rule = $t;
        }
    }

    public function batchGenerate() {
        $passwords = [];
        for ($i = 0; $i < $this->_num; $i++) {
            $passwords[] = $this->generate();
        }
        return $passwords;
    }

    private function generate() {
        $pool = '';
        $force_pool = '';
        // 字母池
        if (isset($this->_rule['letter'])) {
            $letter = $this->getLetter();
            switch ($this->_rule['letter']) {
                case 2: $force_pool .= $letter[mt_rand(0, strlen($letter)-1)]; break;
                case 3: $force_pool .= strtolower($letter[mt_rand(0, strlen($letter)-1)]); $letter = strtolower($letter); break;
                case 4: $force_pool .= strtoupper($letter[mt_rand(0, strlen($letter)-1)]); $letter = strtoupper($letter); break;
                case 5: $force_pool .= strtolower($letter[mt_rand(0, strlen($letter)-1)]);
                        $force_pool .= strtoupper($letter[mt_rand(0, strlen($letter)-1)]); break;
            }
            $pool .= $letter;
        }
        // 数字池
        if (isset($this->_rule['number'])) {
            $number = $this->getNumber();
            if ($this->_rule['number'] === 2) $force_pool .= $number[mt_rand(0, strlen($number)-1)];
            $pool .= $number;
        }
        // 特殊字符池
        if (isset($this->_rule['special'])) {
            $special = $this->getSpecial();
            if ($this->_rule['special'] === 2) $force_pool .= $special[mt_rand(0, strlen($special)-1)];
            $pool .= $special;
        }
        $pool = str_shuffle($pool);
        $password = str_shuffle($force_pool . substr($pool, 0, $this->_length - strlen($force_pool)));
        return $password;
    }

    private function getLetter() { return 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz'; }
    private function getNumber() { return '1234567890'; }
    private function getSpecial() { return $this->_special; }
}
?>

使用示例

 5, // 必须含大小写
    'number'   => 2, // 必须含数字
    'special'  => 2  // 必须含特殊字符
];
$special = '!@#$%_-';

$obj = new GeneratePassword(8, 10, $rule, $special);
$passwords = $obj->batchGenerate();
echo implode('
', $passwords); /* 示例输出: K9!mPq2@ Xy7#Lm4$ ... */ ?>

规则参数速查表

字符类型规则值含义
letter1可选(默认)
2必选(至少1个任意大小写)
3必选小写
4必选大写
5大小写各至少1个
number1可选
2必选
special1可选
2必选

安全建议

  • 生成的密码直接入库前务必用 password_hash() 哈希存储,切勿明文保存。
  • 高安全场景(根密钥、加密密钥)请用 random_bytes() + bin2hex() 或 base64_encode() 生成高熵随机串,而非字符池拼接。
  • 特殊字符集建议排除 Shell/HTML/SQL 特殊字符(如 ' " \ ` $),避免注入风险。

该类代码结构清晰、规则灵活,可直接集成到用户管理、自动化部署、测试数据生成等模块。

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