`
shiyongno1
  • 浏览: 7792 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

密码强度等级

    博客分类:
  • Java
 
阅读更多

密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。 
       一、密码长度: 
       5 分: 小于等于4 个字符 
       10 分: 5 到7 字符 
       25 分: 大于等于8 个字符 
       二、字母: 
       0 分: 没有字母 
       10 分: 全都是小(大)写字母 
       20 分: 大小写混合字母 
       三、数字: 
       0 分: 没有数字 
       10 分: 1 个数字 
       20 分: 大于1 个数字 
       四、符号: 
       0 分: 没有符号 
       10 分: 1 个符号 
       25 分: 大于1 个符号 
       五、奖励: 
       2 分: 字母和数字 
       3 分: 字母、数字和符号 
       5 分: 大小写字母、数字和符号 
       最后的评分标准: 
       >= 90: 非常安全 
       >= 80: 安全(Secure) 
       >= 70: 非常强 
       >= 60: 强(Strong) 
       >= 50: 一般(Average) 
       >= 25: 弱(Weak) 
       >= 0:  非常弱

 

public final class Demo {

	public static Safelevel GetPwdSecurityLevel(String pPasswordStr) {
		/* 在这里实现功能 */
		int grade = 0;

		// 一、密码长度:
		grade += checkLength(pPasswordStr);

		// 二、字母:
		grade += checkZiMu(pPasswordStr);

		// 三、数字:
		grade += checkNumber(pPasswordStr);

		// 四、符号:
		grade += checkFuHao(pPasswordStr);

		// 五、奖励:
		grade += jianli(pPasswordStr);

		// 最后的评分标准:
		return pinFen(grade);
	}

	private static Safelevel pinFen(int grade) {
		Safelevel safe;
		if (grade >= 90) {
			safe = Safelevel.VERY_SECURE;
		} else if (grade >= 80) {
			safe = Safelevel.SECURE;
		} else if (grade >= 70) {
			safe = Safelevel.VERY_STRONG;
		} else if (grade >= 60) {
			safe = Safelevel.STRONG;
		} else if (grade >= 50) {
			safe = Safelevel.AVERAGE;
		} else if (grade >= 25) {
			safe = Safelevel.WEAK;
		} else {
			safe = Safelevel.VERY_WEAK;
		}

		return safe;

	}

	private static int jianli(String pPasswordStr) {
		int grade = 0;

		int minNum = getNumber(pPasswordStr, "[a-z]");
		int maxNum = getNumber(pPasswordStr, "[A-Z]");

		int shuZhiNum = (null == pPasswordStr || "".equals(pPasswordStr.trim())) ? 0
				: getNumber(pPasswordStr, "[0-9]");

		int fuHaonum = ((null == pPasswordStr) ? null : pPasswordStr
				.replaceAll("[\\p{Alnum}]", "").replaceAll(" ", "").length());

		if (minNum != 0 && maxNum != 0 && shuZhiNum != 0 && fuHaonum != 0) {// 大小写字母、数字和符号
			grade = 5;
		} else if ((minNum != 0 || maxNum != 0) && shuZhiNum != 0
				&& fuHaonum != 0) {// 字母、数字和符号
			grade = 3;
		} else if ((minNum != 0 || maxNum != 0) && shuZhiNum != 0) {// 字母和数字
			grade = 0;
		}
		return grade;
	}

	private static int checkFuHao(String pPasswordStr) {
		int grade = 0;
		int num = ((null == pPasswordStr) ? null : pPasswordStr.replaceAll(
				"[\\p{Alnum}]", "").replaceAll(" ", "").length());
		if (num == 0) {
			grade = 0;
		} else if (num == 1) {
			grade = 10;
		} else {
			grade = 25;
		}
		return grade;
	}

	private static int checkNumber(String pPasswordStr) {
		int grade = 0;
		int num = getNumber(pPasswordStr, "[0-9]");
		if (num == 0) {
			grade = 0;
		} else if (num == 1) {
			grade = 10;
		} else {
			grade = 20;
		}
		return grade;
	}

	private static int checkLength(String pPasswordStr) {
		int grade = 0;
		int length = pPasswordStr.length();
		if (length >= 8) {
			grade = 25;
		} else if (length >= 5) {
			grade = 10;
		} else {
			grade = 5;
		}
		return grade;
	}

	private static int checkZiMu(String pPasswordStr) {
		int grade = 0;
		int minNum = getNumber(pPasswordStr, "[a-z]");
		int maxNum = getNumber(pPasswordStr, "[A-Z]");
		if (minNum == 0 && maxNum == 0) {
			grade = 0;
		} else if (minNum == 0 || maxNum == 0) {
			grade = 10;
		} else {
			grade = 20;
		}
		return grade;
	}

	private static int getNumber(String str, String s) {
		char[] c = str.toCharArray();
		int count = 0;

		for (char d : c) {
			if ((d + "").matches(s)) {
				count++;
			}
		}

		return count;
	}
}

 

public enum Safelevel {
	VERY_WEAK, /* 非常弱 */
	WEAK, /* 弱 */
	AVERAGE, /* 一般 */
	STRONG, /* 强 */
	VERY_STRONG, /* 非常强 */
	SECURE, /* 安全 */
	VERY_SECURE
	/* 非常安全 */
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics