密碼驗證java實現


package com.unicom.util;

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

/**
* @Auth wxr
* @Date 2019-12
*/
public class PasswordVerify {
//包含橫向連續的鍵盤輸入或者連續的數字和字母
private static final String[] KEYBOARD_METADATA = {"qwertyuiop[]\\", "asdfghjkl;'", "zxcvbnm,./", "1234567890-=",
"0123456789012345678", "abcdefghijklmnopqrstuvwxyz"};
//包含連續的斜向鍵盤輸入或者常用的數據庫、操作系統等詞組
private static final String[] COTAINEDSTR_METADATA = {"qaz", "wsx", "edc", "rfv", "tgb", "yhn", "ujm", "ik,", "ol.", "p;/", "esz", "rdx",
"tfc", "ygv", "uhb", "ijn", "okm", "pl,", "[;.", "]'/", "1qa", "2ws", "3ed", "4rf", "5tg", "6yh", "7uj", "8ik", "9ol", "0p;", "-['",
"=[;", "-pl", "0ok", "9ij", "8uh", "7yg", "6tf", "5rd", "4es", "3wa", "root", "admin", "mysql", "oracle", "system", "windows",
"linux", "java", "python", "unix"};

/**
* 判斷是否包含連續的斜向鍵盤輸入或者常用的數據庫、操作系統等詞組
*
* @param lowerCasPassword 轉換成小寫的密碼串
* @return 返回不符合規范的字符序列
*/
private static String containTargetStrVerify(String lowerCasPassword) {
for (String string : COTAINEDSTR_METADATA) {
if (lowerCasPassword.contains( string )) {
return string;
}
}
return null;
}

/**
* 判斷是否包含連續的橫向鍵盤輸入或者連續的數字和字母
*
* @param lowerCasPassword 轉換成小寫的密碼串
* @param limitCount 限制連續字符數的最大值
* @return 返回不符合規范的字符序列
*/
private static String containTargetSequenceVerify(String lowerCasPassword, int limitCount) {
char[] chars = lowerCasPassword.toCharArray( );
for (int c = 0; c < chars.length - limitCount; c++) {
char passwordChar = chars[c];
String repeatStr = "";
for (int i = 0; i < limitCount + 1; i++) {
repeatStr += c;
}
if (lowerCasPassword.contains( repeatStr )) {
return repeatStr;
}
for (String strings : KEYBOARD_METADATA) {
if (strings.contains( String.valueOf( passwordChar ) )) {
String substring = lowerCasPassword.substring( c, c + limitCount + 1 );
if (strings.contains( substring )) {
return substring;
}
}
}
}
return null;
}

/**
* 判斷是否含有特殊字符、大寫字母、小寫字母、數字中的三種及以上
* <p>
* true為包含,false為不包含
*/
private static boolean containTypesVerify(String password) {
int contains = 0;
//判斷是否包含特殊字符
String regEx = "[ _`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~@#%……&*()——+|{}【】;:”“’。,、?]|\n|\r|\t";
Pattern p = Pattern.compile( regEx );
Matcher m = p.matcher( password );
if (m.find( )) {
contains++;
}
//判斷是否含有數字
p = Pattern.compile( ".*\\d+.*" );
m = p.matcher( password );
if (m.find( )) {
contains++;
}
//判斷是否含有大寫字母
p = Pattern.compile( "[A-Z]" );
m = p.matcher( password );
if (m.find( )) {
contains++;
}
//判斷是否含有小寫字母
p = Pattern.compile( "[a-z]" );
m = p.matcher( password );
if (m.find( )) {
contains++;
}
return contains > 2;
}

public static String verify(String passwordLowerCase,int limitCount){
if(!containTypesVerify( passwordLowerCase )){
return "密碼需要包含特殊字符、大寫字母、小寫字母、數字中的三種及以上!";
}
String s1=containTargetStrVerify(passwordLowerCase);
if(s1!=null){
return "密碼包含連續的斜向鍵盤輸入或者常用的數據庫、操作系統等詞組!內容為:"+s1+"";
}
String s2=containTargetSequenceVerify(passwordLowerCase,limitCount);
if(s2!=null){
return "密碼包含連續的橫向鍵盤輸入或者連續的數字和字母或者重復的字符輸入!";
}
return null;
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM