我需要生成一个包含8个字符的随机密码。密码必须符合以下政策 -
密码应该
我使用以下功能生成密码。
function random_pass() {
$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
srand((double)microtime()*1000000);
$i = 0;
$pass = '' ;
while ($i <= 7) {
$num = rand() % 60;
$tmp = substr($chars, $num, 1);
$pass = $pass . $tmp;
$i++;
}
return $pass;
}
我写了下面的验证函数,检查生成的密码是否符合密码策略
function password_policy($string)
{
// contains a minimum of one (1) non-alphabetic character
$r1 = '/[^a-zA-Z]+/';
// contains more than two (2) consecutive repeated characters
$r2 = '/(.)\\1{2}/';
if (preg_match_all($r1,$string, $o)<1) {
return "invalid - all alphabetic";
}
if (!preg_match_all($r2,$string, $o)<1) {
return "invalid - more than 2 consecutive repeated chars";
}
return "valid";
}
我的random_pass
并非始终准确无误。在100个中出5-10次,我的密码无法遵守密码策略。
for ($j=0;$j<100;$j++) {
$pass = random_pass();
$validation = password_policy($pass);
if ($validation !== 'valid') {
print_r("$pass -- $validation\n");
}
}
- 输出 -
BCZHDgKl -- invalid - all alphabetic
xfCKKKH3 -- invalid - more than 2 consecutive repeated chars
aMtcWqEx -- invalid - all alphabetic
ZtpDGeKU -- invalid - all alphabetic
如何生成100%符合上述政策的密码。
请帮帮我。 提前谢谢!
答案 0 :(得分:1)
最快的方法是:在循环中的random_pass()函数中检查生成的密码是否满足策略。如果没有,请生成一个新的,直到你得到一个正确的,然后返回它。
答案 1 :(得分:1)
你可以这样做:
function random_pass() {
$chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
srand((double)microtime()*1000000);
$i = 0;
$pass = '' ;
while ($i <= 7) {
$num = rand() % 60;
$tmp = substr($chars, $num, 1);
$pass = $pass . $tmp;
$i++;
}
$valid=password_policy($pass);
if($valid=="valid")
return $pass;
else return random_pass();
}