如何在 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 随机键,而不是随机值。
通过明确定义不同类型的字符,您可以删除一些讨厌的字符。例如,可能很难区分 I
、1
、|
和 l
或 O
和 0
,具体取决于您的字体.你可能想删除那些。您还可以定义自己的一组特殊字符。
然后我通过明确声明保证至少存在一个大写字母、一个小写字母、一个特殊字符和一个数字。
最后我添加了一部分随机长度的随机字符并将整个字符串打乱。
注: 为用户选择密码可能是个好主意。用户经常发现很难选择一个好的密码。但是,您将使用非常难记且难以输入的密码。那真的有必要吗?例如,如果您要求提供电子邮件地址和密码,那么一个 5 位数的 PIN 码已经可以提供 99999 个可能的密码。好多啊。如果您只允许用户在登录表单被阻止之前尝试输入错误密码 5 次,那么黑客通过暴力破解成功的几率只有 0.006%。这些不是很好的机会。对于用户来说,五位数的密码更容易使用。密码的强度应与其保护的内容和其他风险因素成正比。您可能使用的密码有 0.00000000001% 的几率成功破解,但如果用户“自愿”将密码提供给黑客(例如通过 social hacking)的几率为 0.0001%,那么这种做法毫无意义安全密码。
我正在尝试按照标题所说的去做,这就是我在 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 随机键,而不是随机值。
通过明确定义不同类型的字符,您可以删除一些讨厌的字符。例如,可能很难区分 I
、1
、|
和 l
或 O
和 0
,具体取决于您的字体.你可能想删除那些。您还可以定义自己的一组特殊字符。
然后我通过明确声明保证至少存在一个大写字母、一个小写字母、一个特殊字符和一个数字。
最后我添加了一部分随机长度的随机字符并将整个字符串打乱。
注: 为用户选择密码可能是个好主意。用户经常发现很难选择一个好的密码。但是,您将使用非常难记且难以输入的密码。那真的有必要吗?例如,如果您要求提供电子邮件地址和密码,那么一个 5 位数的 PIN 码已经可以提供 99999 个可能的密码。好多啊。如果您只允许用户在登录表单被阻止之前尝试输入错误密码 5 次,那么黑客通过暴力破解成功的几率只有 0.006%。这些不是很好的机会。对于用户来说,五位数的密码更容易使用。密码的强度应与其保护的内容和其他风险因素成正比。您可能使用的密码有 0.00000000001% 的几率成功破解,但如果用户“自愿”将密码提供给黑客(例如通过 social hacking)的几率为 0.0001%,那么这种做法毫无意义安全密码。