首先,定义出密码强度的分类: 弱密码:
- 长度至少为6个字符
中等强度密码:
- 长度至少为6个字符
- 不能包含用户的帐户名
- 包含密码字符集(数字,小写字母,大写字母,特殊字符)3类字符
高等强度密码:
- 长度至少为7个字符
- 包含密码字符集中4类字符
为了让密码检测更具有可扩展性,决定按一下方式构建类:
pass_rule.php密码强度规则文件,修改此文件就可以实现不同的密码强度检测方式
define("UNVALID", 0);
define("WEAK", 1);
define("MIDDLE", 2);
define("STRONG", 3);
/*
* pass rule array(
* rule_name => array("type", "param", "judge condition"),
* )
*/
$pass_rules = array(
"r1" => array("len", "6", ">="),
"r2" => array("len", "7", ">="),
"r3" => array("match", "", "exclude"),
"r4" => array("char_class", "[a-z]", "include"),
"r5" => array("char_class", "[A-Z]", "include"),
"r6" => array("char_class", "[0-9]", "include"),
"r7" => array("char_class", "[~`!@#$%^&*()/-_+={}/[/]|//:;/"'<>,.?//]", "include"),
);
//basic conditions of diff level
$pass_levels = array(
UNVALID => array(),
WEAK => array("len" => "r1"),
MIDDLE => array("len" => "r1", "match" => "r3", "char_class" => "3"),
STRONG => array("len" => "r2", "match" => "r3", "char_class" => "4"),
);
pass_policy.php密码策略文件,定义了通常的检测操作,可根据传入的规则进行检测动作
class pass_intensity_policy
{
private $rules;
function pass_intensity_policy($rules){
$this -> rules = $rules;
}
function check($pass, $user){
$result = array("len" => "", "match" => "", "char_class" => "");
$i = 0;
foreach ($this -> rules as $k => $v) {
if ($v[0] == "len") {
if ($this -> opt_len($pass, $v[1], $v[2]))
$result["len"] .= $k;
}
if ($v[0] == "match") {
if ($this -> opt_match($pass, $user, $v[2]))
$result["match"] = $k;
}
if ($v[0] == "char_class") {
if ($this -> opt_char_class($pass, $v[1], $v[2]))
$result["char_class"] = ++$i;
}
}
return $result;
}
function opt_len($str, $length=0, $option){
if ($option == ">=") {
if (strlen($str) >= $length)
return true;
}
if ($option == "<=") {
if (strlen($str) <= $length)
return true;
}
if ($option == "<") {
if (strlen($str) < $length)
return true;
}
if ($option == ">") {
if (strlen($str) > $length)
return true;
}
if ($option == "==") {
if (strlen($str) == $length)
return true;
}
if ($option == "!=") {
if (strlen($str) != $length)
return true;
}
return false;
}
function opt_match($str, $substr, $option){
if ($option == "exclude") {
//strpos() is faster than preg_match()
return !(strpos($str, $substr) !== false);
//return !preg_match("/$substr/", $str);
}
if ($option == "include") {
return (strpos($str, $substr) !== false);
//return preg_match("/$substr/", $str);
}
if ($option == "equals") {
return ($str == $substr);
//return preg_match("/^$substr$/", $str);
}
if ($option == "noequals") {
return ($str != $substr);
//return !preg_match("/^$substr$/", $str);
}
return false;
}
function opt_char_class($str, $reg, $option){
if ($option == "exclude") {
return !preg_match("/$reg/", $str);
}
if ($option == "include") {
return preg_match("/$reg/", $str);
}
return false;
}
};
p
ass_check.php密码检测类文件,此文件接受规则,生成策略,执行检测,最后返回结果
class pass_intensity_check
{
private $intensity_policy;
private $check_result;
private $stand;
function pass_intensity_check($rules, $stand){
$this -> intensity_policy = new pass_intensity_policy($rules);
$this -> stand = $stand;
}
function do_check($pass, $user){
$this -> check_result = $this -> intensity_policy -> check($pass, $user);
}
function get_level(){
//print_r($this -> check_result);
//decide pass level from 'STRONG' to 'UNVALID'
if (strpos($this -> check_result["len"], $this -> stand[STRONG]["len"])!==false
&& $this -> check_result["match"]==$this -> stand[STRONG]["match"]
&& $this -> check_result["char_class"]>=$this -> stand[STRONG]["char_class"]) {
return STRONG;
}
if ((strpos($this -> check_result["len"], $this -> stand[MIDDLE]["len"])!==false
|| strpos($this -> check_result["len"], $this -> stand[MIDDLE]["len"])!==false)
&& $this -> check_result["match"]==$this -> stand[MIDDLE]["match"]
&& $this -> check_result["char_class"]>=$this -> stand[MIDDLE]["char_class"]) {
return MIDDLE;
}
if (strpos($this -> check_result["len"], $this -> stand[WEAK]["len"])!==false
|| strpos($this -> check_result["len"], $this -> stand[WEAK]["len"])!==false) {
return WEAK;
}
return UNVALID;
}
};
编写此程序的基础是需要了解常规的正则表达式匹配,同时按照面向对象的方法组织,使程序更具扩展性。第一次写文章,不清楚的地方敬请原谅哈