最强密码规则效验(java后台版和javascript版)
2177 字
11 分钟
最强密码规则效验(java后台版和javascript版)
java密码规则效验(java后台版和javascript版)
最强密码规则效验:(java后台版和javascript版) 需求如下: (一)口令至少由8位及以上大小写字母、数字及特殊字符等混合、随机组成(至少包括数字、小写字母、大写字母和特殊符号中的三种)。 同时严禁在口令中包含以下情况:
连续数字或重复数字:如“678”或“AAA”等; 英文单词或拼音:如“oper”或“admin”等; 含有与账号名、主机名、系统名、厂商名相同或相似的字符串; 含有与局房、人员姓名、生日、证件号码、电话号码、手机号码及门牌号码等相同或相似的字符串; 位于键盘相邻位置的字符超过2位,例如“2wsx@WSX”或“2we4@WE$”等; 使用系统或应用的默认口令,例如“ftp@ftp.net”等; 属于弱口令库中的常见口令。 (二)应以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;}后端版:
import org.apache.commons.lang3.StringUtils;import java.util.ArrayList;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern;
public class CheckPassword {
/*** * 描述: 三个或者三个以上相同 * * @param pwd 密码 * @return String */ 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";
}
}
/*** * 描述: 验证生日 、身份证 * * @param pwd 密码 * @return String */ 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"; }
}
/*** * 描述: 密码规则 * * @param pwd 密码 * @return String */ 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 String */ public static String checkPwd(String pwd) { //密码规则 String check = 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(check)) { return check; } 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 String */ 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 String */ 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转换字符 * * @param str 字符串 * @return String */ 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"; } }
/** * 转码 * * @param c 字符 * @return 编码 */ public static int getUnicode(char c) { String returnUniCode = null; returnUniCode = String.valueOf((int) c); return Integer.parseInt(returnUniCode); }
/*** * 描述: 不能连续字符(如123、abc)连续3位或3位以上 * * @param str 字符串 * @return String */ 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"; } }
}文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
最强密码规则效验(java后台版和javascript版)
https://czxcly.cn/posts/最强密码规则效验java后台版和javascript版/ 相关文章 智能推荐
1
Java内存溢出问题
技术文章 Java内存溢出问题
2
Bean,Json和Xml互转
技术文章 Bean,Json和Xml互转
3
Java高并发场景下Mysql问题解决
技术文章 Java高并发场景下Mysql问题解决
4
Java导出Excel增加下拉框选项
技术文章 Java导出Excel增加下拉框选项
5
NoValuePresent异常
技术文章 No value present 异常(Stream流异常)
随机文章 随机推荐