常用密码校验正则:
// 必填数字、大小写字母,且至少8位
String regex = "^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,}$";
// 必填数字、字母、特殊字符,且以字母开头,至少8位以上
String strongRegex = "^(?![0-9]+$)(?![^0-9]+$)(?![a-zA-Z]+$)(?![^a-zA-Z]+$)(?![a-zA-Z0-9]+$)[a-zA-Z0-9\\S]{8,}$";
但是这种正则通常不能满足我们的需要。
现在的需求是:密码必须由数字、大写字母、小写字母、特殊字符这四种,任意3种及以上排列组合,且至少8位。
自定义强密码校验的实现:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
/**
* @author zy
* @date 2021/12/7 16:11
*/
public class CheckPasswordUtils {
/**
* 密码强度检查。数字、小写字母、大写字母、特殊字符 4种任意满足3种及以上即可校验成功
*/
public static boolean check(String password){
// 空对象、空字符串、长度小于8 -> 验证不通过
if (Utils.isNullOrEmpty(password)) return false;
if (password.length() < 8) return false;
StringCounter counter = new StringCounter().initInstance(password);
int kinds = counter.getKinds();
// 四种字符,任意3种即可
return kinds > 2;
}
/**
* main函数测试
*/
public static void main(String[] args) {
List<String> passwordList = new ArrayList<>();
passwordList.add(null); // 验证空对象
passwordList.add(""); // 验证空字符串
passwordList.add("123456"); // 验证密码长度
passwordList.add("lps123456"); // 验证种类
passwordList.add("Lps123456"); // 验证正常密码
passwordList.add("Lps*20210831*"); // 验证强密码
passwordList.forEach(password -> {
System.out.println("[" + password + "] -> " + check(password));
});
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
class StringCounter{
private int number; // 数字出现的次数
private int smallLetter; // 小写字母出现的次数
private int bigLetter; // 大写字母出现的次数
private int symbol; // 特殊符号出现的次数
public StringCounter initInstance(String s){
if (Utils.isNullOrEmpty(s)){
return new StringCounter(0, 0, 0, 0);
}else {
char[] chars = s.toCharArray();
int number = 0, smallLetter = 0, bigLetter = 0, symbol = 0;
for (char c : chars) {
if (c > 47 && c < 58){
number++;
} else if(c > 64 && c < 91){
bigLetter++;
} else if(c > 96 && c < 123){
smallLetter++;
} else {
symbol++;
}
}
return new StringCounter(number, smallLetter, bigLetter, symbol);
}
}
public int getKinds(){
int kinds = 0;
if (this.number > 0) kinds++;
if (this.smallLetter > 0) kinds++;
if (this.bigLetter > 0) kinds++;
if (this.symbol > 0) kinds++;
return kinds;
}
}
main函数输出:
[null] -> false
[] -> false
[123456] -> false
[lps123456] -> false
[Lps123456] -> true
[Lps*20210831*] -> true
Process finished with exit code 0