Java 实现的密码强度校验工具类

257 阅读1分钟
package com.example.demo.util;

import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.List;

/**
 * 校验工具类
 *
 * @author wangbo
 * @since 2024/10/28
 */
@Slf4j
public class ValidationUtil {

    private ValidationUtil() {
        //do something
    }

    private static final String SPECIAL_CHARACTERS = "!@#$%^&*()_+{}:\"<>?";

    /**
     * 是否是无效密码
     * 密码长度不小于8位,包括数字,大小写字母,特殊字符其中三种或三种以上组合
     *
     * @param password 明文密码
     * @return 无效密码返回true,有效密码返回false
     */
    public static boolean isInvalidPassword(String password) {
        if (password == null || password.length() < 8) {
            return true;
        }

        //有数字
        boolean hasDigit = false;
        //有大写字母
        boolean hasCapitalLetter = false;
        //有小写字母
        boolean hasSmallLetter = false;
        //有特殊字符
        boolean hasSpecialChar = false;

        for (char c : password.toCharArray()) {
            if (Character.isDigit(c)) {
                hasDigit = true;
            } else if (Character.isLetter(c) && Character.isUpperCase(c)) {
                hasCapitalLetter = true;
            } else if (Character.isLetter(c) && Character.isLowerCase(c)) {
                hasSmallLetter = true;
            } else if (SPECIAL_CHARACTERS.indexOf(c) != -1) {
                hasSpecialChar = true;
            }
            // 如果已经找到三种不同类型的字符,则可以提前退出循环
            if ((hasDigit && hasCapitalLetter && hasSmallLetter) ||
                    (hasDigit && hasCapitalLetter && hasSpecialChar) ||
                    (hasCapitalLetter && hasSmallLetter && hasSpecialChar) ||
                    (hasDigit && hasSmallLetter && hasSpecialChar)) {
                //常用密码校验
                return isContainCommonPassword(password);
            }
        }
        return true;
    }

    private static final List<String> COMMON_PASSWORD = Arrays.asList("user", "usr", "admin", "administrator", "root",
            "shell", "audit", "auditor", "manager", "web", "sys", "system", "default");

    /**
     * 是否包含常用密码字符
     *
     * @param password 明文密码
     * @return 包含返回true,不包含返回false
     */
    private static boolean isContainCommonPassword(String password) {
        String lowerCasePassword = password.toLowerCase();
        for (String commonPassword : COMMON_PASSWORD) {
            if (lowerCasePassword.contains(commonPassword)) {
                log.info("密码包含了常用密码字符");
                return true;
            }
        }
        return false;
    }
}