【发布时间】: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))