龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

一种密码复杂度的简单计算方式

时间:2014-07-22 14:50来源: 作者: 点击:
分享到:
span style=color:#000000;另外,我实现了一个更为直接的JS版本/span a href=http://www.oschina.net/code/snippet_127301_17269 target=_blank rel=nofollowbr / br / JS版本/a br / br / * 计算密码复杂度的简单规则: br /
另外,我实现了一个更为直接的JS版本

JS版本


* 计算密码复杂度的简单规则:
  1.  将字符分为四类:数字,小写字母,大写字母,特殊字符(@#!之类)
  2.  赋予上述每一类字符一种复杂度,例如将数字的复杂度定义为1,特殊字符的复杂度定义为4
  3.  赋予每一种字符的变换一种复杂度,例如数字转换为特殊字符的复杂度为2,数字转数字的复杂度为0,数字转小写字符的复杂度为1
 * 这样一来,整个密码的复杂度就转换为每一种字符的复杂度+字符之间的变换的复杂度的总和,比如:
 * 密码为Gre72的密码复杂度为G-r-e-7-2,每一个字符有本身的复杂度,转换(横线)代表的复杂度也已经定义,总和就是最终复杂度
 * 最后,考虑到规律性密码,比如123456,对这一类密码,如果发现前后两个字符有规律,则单独计算(如何算规律,以及如何计算规律复杂度,则完全自定义)
 * 我这里采用的是(字符重复,字符递增或递减,数字递增为递减为规律,且规律复杂度为0)
 * 这是一种简单的密码复杂度计算方式,适用于简单情形

<?php
/**
 * 计算密码复杂度的简单规则:
 * 1)将字符分为四类:数字,小写字母,大写字母,特殊字符(@#!之类)
 * 2)赋予上述每一类字符一种复杂度,例如将数字的复杂度定义为1,特殊字符的复杂度定义为4
 * 3)赋予每一种字符的变换一种复杂度,例如数字转换为特殊字符的复杂度为2,数字转数字的复杂度为0,数字转小写字符的复杂度为1
 * 这样一来,整个密码的复杂度就转换为每一种字符的复杂度+字符之间的变换的复杂度的总和,比如:
 * 例如密码为Gre72的密码复杂度为G-r-e-7-2,每一个字符有本身的复杂度,转换(横线)代表的复杂度也已经定义,总和就是最终复杂度
 * 最后,考虑到规律性密码,比如123456,对这一类密码,如果发现前后两个字符有规律,则单独计算(如何算规律,以及如何计算规律复杂度,则完全自定义)
 * 我这里采用的是(字符重复,字符递增或递减,数字递增为递减为规律,且规律复杂度为0)
 * 
 * 这是一种简单的密码复杂度计算方式,适用于简单情形
 * @author Administrator
 *
 */
class Password 
{
	private static $typeComplexs = array(1 => 1, 2, 3, 4);
	private static $typeChange = array(array(1, 2), array(1, 3), array(1, 4), array(2, 3), array(2, 4), array(3, 4));
	private static $typeChangeComplexs = array(1, 1, 2, 1, 2, 2);
	
	public static function computeComplex($password)
	{
		$complex = 0;
		$password = (string)$password;
		$length = strlen($password);
		
		$prefixType = 0;
		$regularChars = array();
		for($i = 0; $i < $length; $i++){
			if(ctype_digit($password[$i])){
				$type = 1;
			}elseif(ctype_lower($password[$i])){
				$type = 2;
			}elseif(ctype_upper($password[$i])){
				$type = 3;
			}else{
				$type = 4;
			}

			if(!in_array($password[$i], $regularChars)){ //规律性字符,不计入复杂度
				$complex += self::$typeComplexs[$type];
				if($prefixType){
					$changeType = array($type, $prefixType);
					sort($changeType);
					$change = array_search($changeType, self::$typeChange);
					if($change !== false){
						$complex += self::$typeChangeComplexs[$change];
					}
				}
			}

			$prefixType = $type;
			$regularChars = self::getRegularChars($password[$i], $prefixType);
		}
		
		return $complex;
	}
	
	/**
	 * 获取一个字符的规律字符集
	 * 下列规则被认为是有规则的
	 * 1)重复字符
	 * 2)数字递增或者递减
	 * 3)字母递增或者递减
	 * @param unknown_type $prefixChar
	 */
	private static function getRegularChars($prefix, $prefixType)
	{
		$regularChars = array($prefix);
		
		switch($prefixType){
			case 1:
				$regularChars[] = $prefix + 1;
				$regularChars[] = $prefix - 1;
				break;
				
			case 2:
			case 3:
				$regularChars[] = chr(ord($prefix) + 1);
				$regularChars[] = chr(ord($prefix) - 1);
				$regularChars = array_filter($regularChars, 'ctype_alnum');
				break;
		}
		
		return $regularChars;
	}
}
?>
精彩图集

赞助商链接