【问题标题】:Generate a random, fixed length password in PHP that comply to a password policy在 PHP 中生成一个符合密码策略的随机、固定长度的密码
【发布时间】:2015-02-06 10:08:35
【问题描述】:

我需要生成一个包含 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% 符合上述政策的密码。

请帮帮我。 提前致谢!

【问题讨论】:

  • 一种简单易懂的方法 - 只需跳过无效密码并继续下一个,直到生成 100 个有效密码。
  • 好吧,你只需要继续生成它,直到它通过你的测试......我猜对性能的影响是可以接受的。如果它只有 5/10 % 的时间失败,这意味着你在第一次迭代中已经没问题的机会很大,如果第一次失败,很可能在第二次之后......
  • 我不想要 100 个有效密码。我想要一个 random_password 生成函数,它肯定会生成一个有效的密码。
  • @Hussain:在你的生成器中有一个循环,例如:do { pass=generate } while(!valid(pass))

标签: php random passwords


【解决方案1】:

最快的方法是:在你的 random_pass() 函数中循环检查生成的密码是否满足策略。如果没有,生成一个新的,直到你得到一个正确的,然后返回它。

【讨论】:

  • 注:1.实际场景中没有for循环。我编写了一个 for 循环来显示 random_pass 函数的不准确性。 2.生成密码后验证密码会减慢我的速度。
【解决方案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++;
    }
    $valid=password_policy($pass);
    if($valid=="valid")
       return $pass;
    else return random_pass();
}

【讨论】:

  • 那么没有别的办法了吗??
  • 是的。因为密码策略是你创建来告诉机器的逻辑
猜你喜欢
  • 2011-08-31
  • 1970-01-01
  • 2021-06-18
  • 2011-04-18
  • 2010-09-08
  • 1970-01-01
  • 2014-12-27
相关资源
最近更新 更多