//验证密码强度(验证密码强度 有 :字母、数字、特殊符号三类构成8~16位以)
public static int checkPasswordIntensionStrong(String passwords,String username)
{
/**
* @date: 2019/5/29 14:01
*(1)口令长度应至少8位;
*(2)口令应包括数字、小写字母、大写字母、特殊符号4类中至少3类;
*(3)口令应与用户名无相关性,不得包含用户名的完整字符串、大小写变位或形似变换的字符串;
*(4)应更换系统或设备的出厂默认口令;
*(5)应避免键盘排序密码。
* */
int relsut=7;
String regEx="[`~!@#$^&*()=|{}':;',\\\\[\\\\].<>/?~!@#¥……&*()——|{}【】‘;:”“'。,、?]";
//数字正则
String numberRegEx="[0-9]";
//大小写字母正则
String aARegEx="[a-zA-Z]";
if(passwords==null||passwords.equals(""))
{
relsut=0;//提醒不能为空
}else if(passwords.length()<8||passwords.length()>16)
{
relsut=1;//提示长度不能小于8
}else if(!Pattern.compile(aARegEx).matcher(passwords).find())
{
relsut=2;//提示至少包含一个字母
}else if(!Pattern.compile(regEx).matcher(passwords).find())
{
relsut=3;//提示至少包含一个特殊字符
}else if(!Pattern.compile(numberRegEx).matcher(passwords).find()){
relsut=4;//提示至少包含一个数字
}else if(Pattern.compile(username.toUpperCase()).matcher(passwords.toUpperCase()).find()){
relsut=5;//提示密码不能包含用户名变形形式
}else if(validateKey(passwords)){
relsut=6;//提示密码不能包含键盘连续四个及以上排序
}
return relsut;
}
//密码不得包含键盘上任意连续的四个字符或shift转换字符
public static boolean validateKey(String passwords) {
//定义横向穷举
String[][] keyCode = {
{"`~·", "1=", "2@@", "3#", "4$¥", "5%", "6^……", "7&", "8*", "9((", "0))", "-_", "=+"},
{" ","qQ", "wW", "eE", "rR", "tT", "yY", "uU", "iI", "oO", "pP", "[{【", "]}】", "\\|、"},
{" ","aA", "sS", "dD", "fF", "gG", "hH", "jJ", "kK", "lL", ";:", "\'\"’“"},
{" ","zZ", "xX", "cC", "vV", "bB", "nN", "mM", ",《<", ".>》", "/??"}
};
//找出给出的字符串,每个字符,在坐标系中的位置。
char[] c = passwords.toCharArray();
List<Integer> x = new ArrayList<Integer>();
List<Integer> y = new ArrayList<Integer>();
for (int i = 0; i < c.length; i++) {
char temp = c[i];
toHere:
for (int j = 0; j < keyCode.length; j++) {
for (int k = 0; k < keyCode[j].length; k++) {
String jk = keyCode[j][k];
if (jk.contains(String.valueOf(temp))) {
x.add(j);
y.add(k);
break toHere;
}
}
}
}
boolean flag = false;
for (int i = 0; i < x.size() - 3; i++) {
// 如果X一致,那么就是在一排
if (x.get(i) .equals(x.get(i + 1)) && x.get(i + 1) .equals(x.get(i + 2)) && x.get(i + 2) .equals(x.get(i + 3)) ) {//四者在同一行上
if (y.get(i) > y.get(i + 3)) {
if (y.get(i) - 1 == y.get(i + 1) && y.get(i) - 2 == y.get(i + 2) && y.get(i) - 3 == y.get(i + 3)) {
flag = true;
break;
}
} else {
if (y.get(i) + 1 == y.get(i + 1) && y.get(i) + 2 == y.get(i + 2) && y.get(i) + 3 == y.get(i + 3)) {
flag = true;
break;
}
}
} else if ((!x.get(i).equals(x.get(i + 1)))
&& (!x.get(i + 1).equals(x.get(i + 2)))
&& (!x.get(i) .equals(x.get(i + 2)))
&& (!x.get(i).equals(x.get(i + 3)))
&& (!x.get(i + 1) .equals(x.get(i + 3)))
&& (!x.get(i + 2) .equals(x.get(i + 3)))
) {//四者均不在同一行上,但是如果y相同,说明是一列
if (y.get(i) .equals(y.get(i + 1)) && y.get(i + 1).equals(y.get(i + 2))&& y.get(i+ 2).equals(y.get(i + 3))) {
flag = true;
break;
}
}
}
return flag;
}