signed

QiShunwang

“诚信为本、客户至上”

JAVA密码校验

2021/5/15 0:39:49   来源:

需求

被产品坑了一波,需求文档长这样,

结果APP一测试,跟我说:

密码不能连续6位或6位以上,也就是说,支持11111aa@

密码不能连续降序或升序6位及6位以上,也就是说,支持12345aa@

这.....不过机智的我还是实现了。

APP接口代码实现

/**
	 * 检查密码是否符合规则,
	 *                                 1.密码长度至少8位以上<br/>
	 *                                 2.密码应至少包含大写字母,小写字母,数字,特殊符号中的三项<br/>
	 *                                 3.禁止使用相同的数字或字符作为密码,如111111,aaaaaa等<br/>
	 *                                 4.禁止使用连续升序或降序的数字或字母作为密码,如123456,abcdef等<br/>
	 *                        true检验合格
	 *                        false检验不合格
	 */
	public static boolean checkPwd(String password) {
		//数字
		String REG_NUMBER = ".*\\d+.*";
		//小写字母
		String REG_UPPERCASE = ".*[A-Z]+.*";
		//大写字母
		String REG_LOWERCASE = ".*[a-z]+.*";
		//特殊符号
		String REG_SYMBOL = ".*[~!@#$%^&*()_+|<>,.?/:;'\\[\\]{}\"]+.*";
		//密码为空或者长度小于8位则返回false
		if (password == null || password.length() <8 ) return false;
		int j = 0;
		if (password.matches(REG_NUMBER)) j++;
		if (password.matches(REG_LOWERCASE))j++;
		if (password.matches(REG_UPPERCASE)) j++;
		if (password.matches(REG_SYMBOL)) j++;
		if (j  < 3 )  return false;

		char[] chars = password.toCharArray();
//		int flag1 = 0;
//		int flag2 = 0;
		for (int i = 0; i < chars.length-5 ; i++) {
			int n1 = chars[i];
			int n2 = chars[i + 1];
			int n3 = chars[i + 2];
			int n4 = chars[i + 3];
			int n5 = chars[i + 4];
			int n6 = chars[i + 5];
			// 判断重复字符
			if (n1 == n2 && n1 == n3 && n1 == n4 && n1 == n5 && n1 == n6) {
				return false;
			}
			// 判断连续字符: 正序 + 倒序
			if ((n1 + 1 == n2 && n1 + 2 == n3 && n1 + 3 == n4 && n1 + 4 == n5 && n1 + 5 == n6 ) || (n1 - 1 == n2 && n1 - 2 == n3 && n1 - 3 == n4 && n1 - 4 == n5 && n1 - 5 == n6)) {
				return false;
			}
		}

//		if(flag1>=6){
//			return false;
//		}
//		if(flag2>=6){
//			return false;
//		}
		return true;
	}

前端JS代码实现

<script>
    function matchPwd(password){
					var reg = new RegExp('(?=.*[0-9])(?=.*[a-zA-Z])(?=.*[^a-zA-Z0-9]).{8}');
					if(!reg.test(password)){
						console.log("222不符合数字、字母、符号");
						return false;
					}
					var chars = password.split('');
					for(var i = 0, l = chars.length; i < l-5; i ++) {
						var n1 = chars[i].charCodeAt();
						var n2 = chars[i + 1].charCodeAt();
						var n3 = chars[i + 2].charCodeAt();
						var n4 = chars[i + 3].charCodeAt();
						var n5 = chars[i + 4].charCodeAt();
						var n6 = chars[i + 5].charCodeAt();
						// 判断重复字符
						if (n1 == n2 && n1 == n3 && n1 == n4 && n1 == n5 && n1 == n6) {
							console.log("333333重复");
							return false;
						}
						// 判断连续字符: 正序 + 倒序
						if ((n1 + 1 == n2 && n1 + 2 == n3 && n1 + 3 == n4 && n1 + 4 == n5 && n1 + 5 == n6 ) || (n1 - 1 == n2 && n1 - 2 == n3 && n1 - 3 == n4 && n1 - 4 == n5 && n1 - 5 == n6)) {
							console.log("44444连续");
							return false;
						}
					}
					return true;
			}

<script/>