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

wri*_*ist 0 php random passwords generator

我正在尝试做标题所说的事情,这就是我能弄清楚如何在 php 中做的所有事情。

<?php 
    $random = substr(md5(mt_rand()), 0, 8
    echo $random;
?>
Run Code Online (Sandbox Code Playgroud)

KIK*_*are 7

我创建了这个基本代码:

$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;
Run Code Online (Sandbox Code Playgroud)

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

通过显式定义不同类型的字符,您可以删除一些讨厌的字符。例如,根据您的字体,可能很难区分I1|lO和。0您可能想删除它们。您还可以定义自己的特殊字符集。

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

最后,我添加一部分随机长度的随机字符并对整个字符串进行打乱。

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