全網最強密碼規則效驗(java後臺版和javascript版)

全網最強密碼規則效驗(java後臺版和javascript版)

最強密碼規則效驗:(java後臺版和javascript版)
需求如下:

  • (一)口令至少由8位及以上大小寫字母、數字及特殊字符等混合、隨機組成(至少包括數字、小寫字母、大寫字母和特殊符號中的三種)。
    同時嚴禁在口令中包含以下情況:

    連續數字或重複數字:如“678”或“AAA”等; 英文單詞或拼音:如“oper”或“admin”等;
    含有與賬號名、主機名、系統名、廠商名相同或相似的字符串;
    含有與局房、人員姓名、生日、證件號碼、電話號碼、手機號碼及門牌號碼等相同或相似的字符串;
    位於鍵盤相鄰位置的字符超過2位,例如“2wsx@WSX”或“2we4@WE$”等;
    使用系統或應用的默認口令,例如“[email protected]”等; 屬於弱口令庫中的常見口令。
    (二)應以HASH或者加密技術保存口令,不得以明文方式保存或者傳輸;
    (三)賬號使用者至少每90天對口令更換一次,5次以內不得設置相同的口令。修改口令時,須保留口令修改記錄以備審計(具體格式參見附件1);
    (四)重要系統應採用短信動態口令、證書等強認證登錄方式。
    (五)由於員工離職等原因,原賬號不能刪除或者需要重新賦予另一個人時,應修改相應賬號的口令。

前端版:



function checkProv(val) {
	var pattern = /^[1-9][0-9]/;
	var provs = {11:"北京",12:"天津",13:"河北",14:"山西",15:"內蒙古",21:"遼寧",22:"吉林",23:"黑龍江 ",31:"上海",32:"江蘇",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山東",41:"河南",42:"湖北 ",43:"湖南",44:"廣東",45:"廣西",46:"海南",50:"重慶",51:"四川",52:"貴州",53:"雲南",54:"西藏 ",61:"陝西",62:"甘肅",63:"青海",64:"寧夏",65:"新疆",71:"臺灣",81:"香港",82:"澳門"};
	if(pattern.test(val)) {
		if(provs[val]) {
			return true;
		}
	}
	return false;

}

function checkDate(val) {
	var pattern = /^(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)$/;
	if(pattern.test(val)) {
		var year = val.substring(0, 4);
		var month = val.substring(4, 6);
		var date = val.substring(6, 8);
		var date2 = new Date(year+"-"+month+"-"+date);
		if(date2 && date2.getMonth() == (parseInt(month) - 1)) {
			return true;
		}
	}
	return false;
}
function checkCode(val) {
	var p = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
	var factor = [ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 ];
	var parity = [ 1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2 ];
	var code = val.substring(17);
	if(p.test(val)) {
		var sum = 0;
		for(var i=0;i<17;i++) {
			sum += val[i]*factor[i];
		}
		if(parity[sum % 11] == code.toUpperCase()) {
			return true;
		}
	}
	return false;
}


//檢測密碼是否是身份證
function checkID(val) {
	if (checkCode(val)) {
		var date = val.substring(6, 14);
		if (checkDate(date)) {
			if (checkProv(val.substring(0, 2))) {
				return true;
			}
		}
	}
	return false;
}

//密碼不得包含鍵盤上任意連續的三個字符或shift轉換字符
function validateKey(str) {
	//定義橫向窮舉
	var 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", ",《<", ".>》", "/??"]
	];

	//找出給出的字符串,每個字符,在座標系中的位置。
	var c = str.split("");
	console.log(c)
	var x = new Array();
	var y = new Array();
	for (var i = 0; i < c.length; i++) {
		var temp = c[i];
		toHere:
				for (var j = 0; j < keyCode.length; j++) {
					for (var k = 0; k < keyCode[j].length; k++) {
						var jk = keyCode[j][k];
						if (jk.indexOf(temp)!=-1) {
							x.push(j);
							y.push(k);
							break toHere;
						}
					}
				}
	}
	var flag = false;
	for (var i = 0; i < x.length - 2; i++) {
		// 如果X一致,那麼就是在一排
		if (x[i] == x[i + 1] && x[i + 1] == x[i + 2]) {//四者在同一行上
			if (y[i] > y[i + 2]) {
				if (y[i] - 1 == y[i + 1] && y[i] - 2 == y[i + 2]) {
					flag = true;
					break;
				}
			} else {
				if (y[i] + 1 == y[i + 1] && y[i] + 2 == y[i + 2]) {
					flag = true;
					break;
				}
			}
		} else if (x[i] != x[i + 1]
				&& x[i + 1] != x[i + 2]
				&& x[i] != x[i + 2]
		) {//四者均不在同一行上,但是如果y相同,說明是一列
			if (y[i] == y[i + 1] && y[i + 1] == y[i + 2]) {
				flag = true;
				break;
			}
		}
	}
	return flag;
}


//不能相同字符(如111、aaa)連續3位或3位以上
function checkSame(str) {
	var re = /(\w)*(\w)\2{2}(\w)*/g;
	if(re.test(str)){
		return true;
	}else{
		return false;
	}
}

//不能連續字符(如123、abc)連續3位或3位以上
function checkRepeat(str){
	var arr = str.split('');
	var flag = false;
	for (var i = 1; i < arr.length-1; i++) {
		var firstIndex = arr[i-1].charCodeAt();
		var secondIndex = arr[i].charCodeAt();
		var thirdIndex = arr[i+1].charCodeAt();
		thirdIndex - secondIndex == 1;
		secondIndex - firstIndex==1;
		if((thirdIndex - secondIndex == 1)&&(secondIndex - firstIndex==1)){
			flag =  true;
		}
	}
	if(!flag){
		return flag;
	}
	return flag;
}

後臺:

```java
package com.cmcc.system.util;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;

public class CheckPassword {

/**
 * 三個或者三個以上相同
 * @return
 */
public static String  check3(String pwd) {

	String regx = "^.*(.)\\1{2}.*$";
	Matcher m = null;
	Pattern p = null;
	p = Pattern.compile(regx);
	m = p.matcher(pwd);
	if(m.matches()) {
		return "包含三個或者三個以上相同";
	}else {
		return "ok";

	}
	
}


/**
 * 驗證生日 、身份證
 * @return
 */
public static String  checkBirthday(String pwd) {
	String birthday = "(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229)";

    Pattern pattern = Pattern.compile(birthday);
    Matcher matcher = pattern.matcher(pwd);
	
	if (matcher.find()) {
		return "包含生日或者身份證";
	}else {
    	return "ok";
	}

}




/**
 * 密碼規則
 * @return
 */
public static String  checkp(String pwd) {
	String str = "^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![A-Z\\W_!@#$%^&*`~()-+=]+$)(?![a-z0-9]+$)(?![a-z\\W_!@#$%^&*`~()-+=]+$)(?![0-9\\W_!@#$%^&*`~()-+=]+$)[a-zA-Z0-9\\W_!@#$%^&*`~()-+=]{8,30}$";
	if (!pwd.matches(str)) {
		return "口令至少由8位及以上大小寫字母、數字及特殊字符等混合、隨機組成(至少包括數字、小寫字母、大寫字母和特殊符號中的三種";
	}else {
    	return "ok";
	}

}



/**
 * 驗證密碼
 * @param pwd
 * @return
 */
public static String checkPwd(String pwd) {
	//密碼規則
	String checkp = checkp(pwd);
	//鍵盤上連續3位或者以上
	String rsThree = validateKey(pwd);
	
	String repeat = checkRepeat(pwd);
	//包含生日
	String checkBirthday = checkBirthday(pwd);
	//三個或者三個以上相同
	String check3 = check3(pwd);
	//包含手機號
	String checkMobile = checkMobile(pwd);
	//包含固定電話
	String checkPhone = checkPhone(pwd);

	
	if (!"ok".equals(checkp)) {
		return checkp;
	}else if(!"ok".equals(rsThree)) {
		return rsThree;
	}else if(!"ok".equals(repeat)) {
		return repeat;
	}else if(!"ok".equals(checkBirthday)) {
		return checkBirthday;
	}else if(!"ok".equals(check3)) {
		return check3;
	}else if(!"ok".equals(checkMobile)) {
		return checkMobile;
	}else if(!"ok".equals(checkPhone)) {
		return checkPhone;
	}else {
		return "true";
	}
	
}







/**
 * 包含手機號
 * @param sParam
 * @return
 */
public static String checkMobile(String sParam){

	if(sParam.length()<=0)
	return "";
	Pattern pattern = Pattern.compile("(1|861)(3|4|5|6||7|8|9)\\d{9}$*");
	Matcher matcher = pattern.matcher(sParam);
	StringBuffer bf = new StringBuffer();
	while (matcher.find()) {
	bf.append(matcher.group()).append(",");
	}
	int len = bf.length();
	if (len > 0) {
	bf.deleteCharAt(len - 1);
	}
	if (StringUtils.isNotBlank(bf.toString())) {
		return "包含手機號";
	}else {
		return "ok";
	}
	}


/**
 * 包含固定電話
 * @param content
 * @return
 */
public static String checkPhone(String content) {
   List<String> list = new ArrayList<>();
    Pattern p = Pattern.compile("\\d{3}-\\d{8}|\\d{4}-\\d{6}|\\d{7}|\\d{8}");
    Matcher matcher = p.matcher(content);
    while (matcher.find()) {
        String n = matcher.group(0).toString();
        list.add(n);
    }
    if (!list.isEmpty()) {
		return "包含固定電話";
	}else {
		return "ok";
	}
}



//密碼不得包含鍵盤上任意連續的三個字符或shift轉換字符
public static String validateKey(String str) {

    //定義橫向窮舉
    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 = str.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() - 2; i++) {
        // 如果X一致,那麼就是在一排
        if (x.get(i) == x.get(i + 1) && x.get(i + 1) == x.get(i + 2) ) {//四者在同一行上
            if (y.get(i) > y.get(i + 2)) {
                if (y.get(i) - 1 == y.get(i + 1) && y.get(i) - 2 == y.get(i + 2) ) {
                    flag = true;
                    break;
                }
            } else {
                if (y.get(i) + 1 == y.get(i + 1) && y.get(i) + 2 == y.get(i + 2) ) {
                    flag = true;
                    break;
                }
            }

        } else if (x.get(i) != x.get(i + 1)
                && x.get(i + 1) != x.get(i + 2)
                && x.get(i) != x.get(i + 2)
               ) {//四者均不在同一行上,但是如果y相同,說明是一列
                if (y.get(i) == y.get(i + 1) && y.get(i + 1) == y.get(i + 2)) {
                    flag = true;
                    break;
            }
        }

    }
	if (flag) {
    	return "不能連續三個或者三個以上字符";

	}else {
		return "ok";
	}
}

//轉碼
public static int getUnicode(char c){
	String returnUniCode=null;
	returnUniCode=String.valueOf((int)c); 
	return  Integer.parseInt(returnUniCode);
}
 //不能連續字符(如123、abc)連續3位或3位以上
public static String checkRepeat(String str){
	String[] arr = str.split("");
	boolean flag = false;
	for (int i = 1; i < arr.length-1; i++) {
		int firstIndex = getUnicode(arr[i-1].charAt(0));
		int secondIndex = getUnicode(arr[i].charAt(0));
		int thirdIndex = getUnicode (arr[i+1].charAt(0));
		if((thirdIndex - secondIndex == 1)&&(secondIndex - firstIndex==1)){
			flag =  true;
		}
	}
	if (flag) {
    	return "不能連續3字母";

	}else {
		return "ok";
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章