如何在 php 中每次生成至少一个大写字母、小写字母、特殊字符和数字的随机密码生成器

How to make a random password generator with at least one capital letter, lowercase letter, special character and number everytime in php

我正在尝试按照标题所说的去做,这就是我在 php.

中所能想到的全部内容
<?php 
    $random = substr(md5(mt_rand()), 0, 8
    echo $random;
?>
public function randomPasswordGenerator()
{

    $password = '';
    $passwordSets = ['1234567890', '%^&@*#(){}', 'ABCDEFGHJKLMNPQRSTUVWXYZ', 'abcdefghjkmnpqrstuvwxyz'];

    //Get random character from the array
    foreach ($passwordSets as $passwordSet) {
        $password .= $passwordSet[array_rand(str_split($passwordSet))];
    }

    // 6 is the length of password we want
    while (strlen($password) < 6) {
        $randomSet = $passwordSets[array_rand($passwordSets)];
        $password .= $randomSet[array_rand(str_split($randomSet))];
    }
    echo $password;
}

我创建了这个基本代码:

$digits    = array_flip(range('0', '9'));
$lowercase = array_flip(range('a', 'z'));
$uppercase = array_flip(range('A', 'Z')); 
$special   = array_flip(str_split('!@#$%^&*()_+=-}{[}]\|;:<>?/'));
$combined  = array_merge($digits, $lowercase, $uppercase, $special);

$password  = str_shuffle(array_rand($digits) .
                         array_rand($lowercase) .
                         array_rand($uppercase) . 
                         array_rand($special) . 
                         implode(array_rand($combined, rand(4, 8))));

echo $password;

首先我创建数组,其中的键是变量名描述的内容。这可能看起来有些奇怪,但这样做是因为 array_rand() returns 随机键,而不是随机值。

通过明确定义不同类型的字符,您可以删除一些讨厌的字符。例如,可能很难区分 I1|lO0,具体取决于您的字体.你可能想删除那些。您还可以定义自己的一组特殊字符。

然后我通过明确声明保证至少存在一个大写字母、一个小写字母、一个特殊字符和一个数字。

最后我添加了一部分随机长度的随机字符并将整个字符串打乱。

注: 为用户选择密码可能是个好主意。用户经常发现很难选择一个好的密码。但是,您将使用非常难记且难以输入的密码。那真的有必要吗?例如,如果您要求提供电子邮件地址和密码,那么一个 5 位数的 PIN 码已经可以提供 99999 个可能的密码。好多啊。如果您只允许用户在登录表单被阻止之前尝试输入错误密码 5 次,那么黑客通过暴力破解成功的几率只有 0.006%。这些不是很好的机会。对于用户来说,五位数的密码更容易使用。密码的强度应与其保护的内容和其他风险因素成正比。您可能使用的密码有 0.00000000001% 的几率成功破解,但如果用户“自愿”将密码提供给黑客(例如通过 social hacking)的几率为 0.0001%,那么这种做法毫无意义安全密码。