弱密码强度验证

	//验证密码强度(验证密码强度  有 :字母、数字、特殊符号三类构成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;
	}