密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。
一、密码长度:
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
/* 非常安全 */
}