在PHP中生成符合密码策略的随机,固定长度密码

时间:2015-02-06 10:08:35

标签: php random passwords

我需要生成一个包含8个字符的随机密码。密码必须符合以下政策 -

密码应该

  • 包含至少一(1)个非字母字符
  • 不超过两(2)个连续重复的字符

我使用以下功能生成密码。

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%符合上述政策的密码。

请帮帮我。 提前谢谢!

2 个答案:

答案 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();
}