基本上我有一个允许成员注册的脚本,密码当前必须包含至少1个小写,1个大写,1个数字和1个特殊字符,密码长度也必须至少为8个字符。 / p>
在注册和密码更改页面上,我想建议3个随机生成的强密码,但不确定我的方法是否是最好的方法。
基本上我运行substr(str_shuffle());对于4组字符,第一组是小写,第二组是大写,第三组是数字,第四是特殊字符。
某些字母/数字已被省略,例如零和O,以避免混淆2.我还重复了每个字符,以允许每个字符的选项被包含多次。
然后我在前4个结果的输出上做一个最终的substr(str_shuffle())来生成一个长度为10个字符的密码,并且每个包含至少2个小写,大写,数字和特殊字符。// Generates a secure random password
$random_LC = substr(str_shuffle("abcdefghjkmnpqrstuvwxyzabcdefghjkmnpqrstuvwxyz"), 0, 2);
$random_UC = substr(str_shuffle("ABCDEFGHJKLMNPQRSTUVWXYZABCDEFGHJKLMNPQRSTUVWXYZ"), 0, 2);
$random_NC = substr(str_shuffle("2345678923456789"), 0, 2);
$random_SC = substr(str_shuffle("@~#[]{}+&*%()£$\/<>@~#[]{}+&*%()£$\/<>"), 0, 4);
$random_PW = substr(str_shuffle("$random_LC$random_UC$random_NC$random_SC"), 0, 10);
$random_PW2 = substr(str_shuffle("$random_LC$random_UC$random_NC$random_SC"), 0, 10);
$random_PW3 = substr(str_shuffle("$random_LC$random_UC$random_NC$random_SC"), 0, 10);
然后输出可以通过$ random_PW,$ random_PW2等回显。
上述代码输出的当前示例
vH}[2p$W2&
5$/wM6q(\P
qM5w6/$\P(
$PM\/65w(q
我相信如果我只针对所有字符做了1个substr(str_shuffle()),那么很有可能它不符合输出中包含的每个字符类型中至少1个的要求。
是否有更简单的方法来生成符合上述要求的随机密码?
答案 0 :(得分:1)
我建议也改变密码的长度。
可能最好不要有一定数量的特殊字符,小写字母,大写字母和数字。您可以确保至少有其中一个并生成混合字符的随机变体。
这是一个改进版本(生成8到12个字符之间的密码,符合您要求的标准):
$chr = array_merge(
range('A', 'N'), range('P', 'Z'),
range('a', 'n'), range('p', 'z'),
range(2, 9), str_split('@~#[]{}+&*%()£$\/<>')
);
$password = $chr[mt_rand(0, 24)] . $chr[mt_rand(25, 49)]
. $chr[mt_rand(50, 57)] . $chr[mt_rand(58, 76)];
for ($i = rand(4, 8); $i >= 0; $i--) {
$password .= $chr[mt_rand(0, count($chr) - 1)];
}
$password = str_shuffle($password);