Java实现登录密码强度校验的项目实践

 更新时间:2024年01月25日 15:05:35   作者:道小生  
本文主要介绍了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位以上");
    }
    
	// 其他逻辑
	......
}

以上两种方式都可实现密码强度校验,可根据自身业务需要选择使用。

到此这篇关于Java实现登录密码强度校验的项目实践的文章就介绍到这了,更多相关Java 登录密码强度校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring多线程通过@Scheduled实现定时任务

    Spring多线程通过@Scheduled实现定时任务

    这篇文章主要介绍了Spring多线程通过@Scheduled实现定时任务,@Scheduled 定时任务调度注解,是spring定时任务中最重要的,下文关于其具体介绍,需要的小伙伴可以参考一下
    2022-05-05
  • 学习Java中的List集合

    学习Java中的List集合

    这篇文章主要介绍了学习Java中的List集合,List是一个有序集合, 说是集合,其实只是只是Collection接口的一个子接口,下面关于List的相关资料 需要的小伙伴可以参考一下,希望对你有所帮助
    2022-02-02
  • Nacos负载均衡策略总结

    Nacos负载均衡策略总结

    Nacos 作为目前主流的微服务中间件,包含了两个顶级的微服务功能:配置中心和注册中心,本文给大家总结了几种Nacos负载均衡策略,通过图文结合介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • MyBatis中insert操作返回主键的实现方法

    MyBatis中insert操作返回主键的实现方法

    在使用MyBatis做持久层时,insert语句默认是不返回记录的主键值,而是返回插入的记录条数。这篇文章主要介绍了MyBatis中insert操作返回主键的方法,需要的朋友可以参考下
    2016-09-09
  • springboot整合日志处理Logback的实现示例

    springboot整合日志处理Logback的实现示例

    Logback是由log4j创始人设计的又一个开源日志组件,本文主要介绍了springboot整合日志处理Logback,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-01-01
  • java图的深度优先遍历实现随机生成迷宫

    java图的深度优先遍历实现随机生成迷宫

    这篇文章主要为大家详细介绍了java图的深度优先遍历实现随机生成迷宫,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • SpringMVC工作原理实例详解

    SpringMVC工作原理实例详解

    这篇文章主要介绍了SpringMVC工作原理实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java中利用Alibaba开源技术EasyExcel来操作Excel表的示例代码

    Java中利用Alibaba开源技术EasyExcel来操作Excel表的示例代码

    这篇文章主要介绍了Java中利用Alibaba开源技术EasyExcel来操作Excel表的示例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 运行时常量池和字符串常量池的区别及说明

    运行时常量池和字符串常量池的区别及说明

    这篇文章主要介绍了运行时常量池和字符串常量池的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 基于SpringBoot实现用户身份验证工具

    基于SpringBoot实现用户身份验证工具

    这篇文章主要介绍了基于SpringBoot实现的用户身份验证工具,非常不错,具有参考借鉴价值 ,需要的朋友可以参考下
    2018-04-04

最新评论