Java实现登录密码强度校验
方式1:使用正则表达式匹配校验
- 不同规则表达式
- 密码必须包含大写、小写、数字和特殊字符,且长度是8位以上
private static final String PWD_REGEX = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!@#$%^&*()=_+;':,.?]).{8,}$";
- 密码必须包含大写、小写、数字和特殊字符,且长度是8-32位
private static final String PWD_REGEX = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!@#$%^&*()=_+;':,.?]).{8,32}$";
- 密码是8-16位字母和数字的组合
private static final String PWD_REGEX = "^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$";
可以根据自己的使用需求,自己组合
- 使用
public class CheckPwdUtil {
/**
* 密码必须包含大写、小写、数字和特殊字符,且长度是8位以上
*/
private static final String PWD_REGEX = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!@#$%^&*()=_+;':,.?]).{8,}$";
/**
* 密码复杂度校验
* @param password 密码
* @return 校验密码强度是否合格 true/false
*/
public static boolean isStrongPassword(String password) {
if (StringUtils.isBlank(password)) {
return false;
}
return password.matches(PWD_REGEX);
}
}
方式2:密码强度校验工具类
- 工具类
public class CheckPwdUtil {
private CheckPwdUtil(){}
/**
* 密码等级枚举
* 这里可以根据实际业务需求,扩展更多等级
* 例如:EASY, MIDIUM, STRONG, VERY_STRONG等
*/
public enum PASSWD_LEVEL {
EASY, STRONG
}
/**
* NUM 数字
* SMALL_LETTER 小写字母
* CAPITAL_LETTER 大写字母
* OTHER_CHAR 特殊字符
*/
private static final int NUM = 1;
private static final int SMALL_LETTER = 2;
private static final int CAPITAL_LETTER = 3;
private static final int OTHER_CHAR = 4;
/**
* 获得密码强度等级,包括EASY、STRONG
* @param passwd 密码
* @return 密码等级枚举
*/
public static PASSWD_LEVEL getPasswordLevel(String passwd) {
int level = check(passwd);
/**
* 这里可以根据业务需求,判断不同的level来区分多级密码强度
* 例如:
* level <= 2 为EASY
* 2 < level < 5 为MIDIUM
* level > 5 为STRONG
* level > 5 为VERY_STRONG
*/
if (level < 5) {
return CheckPwdUtil.PASSWD_LEVEL.EASY;
} else {
return CheckPwdUtil.PASSWD_LEVEL.STRONG;
}
}
/**
* 检查密码的强度
*
* @param passwd 密码
* @return 密码等级
*/
private static int check(String passwd) {
if (null == passwd) {
throw new IllegalArgumentException("密码为空");
}
int level = 0;
// 增加点
//判断密码长度是否大于等于8 是level++
int len = passwd.length();
if (len >= 8) {
level++;
}
//判断密码是否含有数字 有level++
if (countLetter(passwd, NUM) > 0) {
level++;
}
//判断密码是否含有小写字母 有level++
if (countLetter(passwd, SMALL_LETTER) > 0) {
level++;
}
//判断密码是否还有大写字母 有level++
if (countLetter(passwd, CAPITAL_LETTER) > 0) {
level++;
}
//判断密码是否还有特殊字符 有level++
if (countLetter(passwd, OTHER_CHAR) > 0) {
level++;
}
return level;
}
/**
* 计算密码中指定字符类型的数量
*
* @param passwd 密码
* @param type 类型
* @return 数量
*/
private static int countLetter(String passwd, int type) {
int count = 0;
if (null != passwd && !passwd.isEmpty()) {
for (char c : passwd.toCharArray()) {
if (checkCharacterType(c) == type) {
count++;
}
}
}
return count;
}
/**
*检查字符类型,包括num、大写字母、小写字母和其他字符。
*
* @param c – 字符
* @return 类型
*/
private static int checkCharacterType(char c) {
if (c >= 48 && c <= 57) {
return NUM;
}
if (c >= 65 && c <= 90) {
return CAPITAL_LETTER;
}
if (c >= 97 && c <= 122) {
return SMALL_LETTER;
}
return OTHER_CHAR;
}
}
- 使用
/**
* 账号注册
*
* @param param 注册账号信息
* @return 接口统一返回
*/
public Result signIn(Param param) {
// 其他逻辑
......
if (CheckPwdUtil.PASSWD_LEVEL.EASY.equals(CheckPwdUtil.getPasswordLevel(param.getPassword()))) {
return new Err<>("密码必须包含大写字母、小写字母、数字和特殊字符,且长度是8位以上");
}
// 其他逻辑
......
}
以上两种方式都可实现密码强度校验,可根据自身业务需要选择使用。