JAVA强密码校验算法示例代码

 更新时间:2025年07月30日 09:04:50   作者:奋力向前123  
最近系统需要做用户密码升级,增加强密码校验,密码长度,复杂度等等,这篇文章主要介绍了JAVA强密码校验算法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

一、需求

(1)禁止使用连续的三个数字或键盘连续的三个字母作为密码的组成部分,如asdf@123、abcd@1234 、qaz@wsx等; (2)禁止使用系统账号、姓名、出生日期的作为密码的组成部分,如:zhangsan@123、admin@123、Ctg@2021; (3)避免使用字典口令,包括许多大家习惯性设置的口令,比如常见的字典口令:Qaz@wsx、Admin123、hkcts@123、Ctg12345等

二、算法:

import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.regex.Pattern;

import lombok.extern.slf4j.Slf4j;

/**
* 
*/
@Slf4j
public class PasswordValidatorUtils {
    // 禁止使用的系统账号、常见姓名和字典口令
    private static final Set<String> FORBIDDEN_WORDS = new HashSet<>(Arrays.asList(
        "admin", "root", "system", "user", "password", 
        "zhangsan", "lisi", "wangwu", "qaz", "wsx", 
        "qwerty", "asdf", "zxcv", "12345", "admin123",
        "hkcts", "ctg"
    ));
    
    // 键盘上相邻的键位组合(QWERTY键盘布局)
    private static final String[] KEYBOARD_SEQUENCES = {
        "qwertyuiop", "asdfghjkl", "zxcvbnm",
        "1234567890", "1qaz", "2wsx", "3edc", "4rfv", "5tgb", "6yhn", "7ujm", "8ik", "9ol", "0p",
        "qaz", "wsx", "edc", "rfv", "tgb", "yhn", "ujm", "ik", "ol", "p"
    };
    
    // 检查密码是否包含连续的三个数字或键盘连续的三个字母
    public static boolean containsKeyboardSequence(String password) {
        password = password.toLowerCase();
        
        // 检查连续三个数字
        if (Pattern.compile("\\d{3}").matcher(password).find()) {
            return true;
        }
        
        // 检查键盘连续三个键
        for (String sequence : KEYBOARD_SEQUENCES) {
            for (int i = 0; i <= sequence.length() - 3; i++) {
                String subSeq = sequence.substring(i, i + 3);
                if (password.contains(subSeq)) {
                    return true;
                }
                // 反向检查
                String reverseSubSeq = new StringBuilder(subSeq).reverse().toString();
                if (password.contains(reverseSubSeq)) {
                    return true;
                }
            }
        }
        
        return false;
    }
    
    // 检查密码是否包含禁止的词汇
    public static boolean containsForbiddenWords(String password) {
        String lowerPwd = password.toLowerCase();
        for (String word : FORBIDDEN_WORDS) {
            if (lowerPwd.contains(word)) {
                return true;
            }
        }
        return false;
    }
   
    
    // 综合验证密码
    public static Map<String,Object> validatePassword(String password) {
        Map<String,Object> map = new HashMap<String,Object>();
        if (password == null || password.length() < 8) {
            log.info("密码长度至少8位");
            map.put("boolean", false);
            map.put("msg", "密码长度至少8位");
            return map;
        }
        
        if (containsKeyboardSequence(password)) {
            log.info("密码不能包含连续的三个数字或键盘连续的三个字母");
            map.put("boolean", false);
            map.put("msg", "密码不能包含连续的三个数字或键盘连续的三个字母");
            return map;
        }
        
        if (containsForbiddenWords(password)) {
            log.info("密码不能包含系统账号、常见姓名或字典口令");
            map.put("boolean", false);
            map.put("msg", "密码不能包含系统账号、常见姓名或字典口令");
            return map;
        }
    
        // 检查密码复杂度
        if (!Pattern.compile("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$").matcher(password).matches()) {
            log.info("密码必须包含大小写字母、数字和特殊字符");
            map.put("boolean", false);
            map.put("msg", "密码必须包含大小写字母、数字和特殊字符");
            return map;
        }
        map.put("boolean", true);
        map.put("msg", "密码符合规则");
        return map;
    }
    
    public static void main(String[] args) {
        // 验证密码
        Map<String,Object> isValid = new PasswordValidatorUtils().validatePassword("ctgssw0rd");
         
        // 返回true表示密码符合要求,false表示不符合
    }

}

总结 

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

相关文章

  • Springboot 如何指定获取出 yml文件里面的配置值

    Springboot 如何指定获取出 yml文件里面的配置值

    这篇文章主要介绍了Springboot 如何指定获取出 yml文件里面的配置值操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • 如何在Spring Boot应用中优雅的使用Date和LocalDateTime的教程详解

    如何在Spring Boot应用中优雅的使用Date和LocalDateTime的教程详解

    这篇文章主要介绍了如何在Spring Boot应用中优雅的使用Date和LocalDateTime,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • Servlet+MyBatis项目转Spring Cloud微服务,多数据源配置修改建议

    Servlet+MyBatis项目转Spring Cloud微服务,多数据源配置修改建议

    今天小编就为大家分享一篇关于Servlet+MyBatis项目转Spring Cloud微服务,多数据源配置修改建议,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java SpringAOP技术之注解方式详解

    Java SpringAOP技术之注解方式详解

    这篇文章主要为大家详细介绍了Java SpringAOP技术之注解方式,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • SpringBoot 集成 Druid过程解析

    SpringBoot 集成 Druid过程解析

    这篇文章主要介绍了SpringBoot 集成 Druid过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • Triple协议支持Java异常回传设计实现详解

    Triple协议支持Java异常回传设计实现详解

    这篇文章主要为大家介绍了Triple协议支持Java异常回传设计实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • SpringBoot @Async如何自定义线程池及使用教程

    SpringBoot @Async如何自定义线程池及使用教程

    这篇文章主要介绍了SpringBoot @Async如何自定义线程池及使用教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • SpringBoot中实现定时任务的几种方式

    SpringBoot中实现定时任务的几种方式

    定时任务在我们项目开发中也是很重要的,对于某些场景必须要用定时任务 ,如定时发送邮件啊,定时统计数据等,这篇文章主要讲讲项目中实现定时任务的几种方式,需要的朋友可以参考下
    2023-05-05
  • Spring Security中的CORS详解

    Spring Security中的CORS详解

    CORS(Cross-Origin Resource Sharing)是一种允许不同源之间进行资源共享的W3C标准,它通过在服务器端设置特定的HTTP响应头,实现了跨域请求的功能,这种机制要求浏览器和服务器的支持,本文给大家介绍Spring Security中的CORS,感兴趣的朋友一起看看吧
    2024-10-10
  • MyBatis注解开发-@Insert和@InsertProvider的使用

    MyBatis注解开发-@Insert和@InsertProvider的使用

    这篇文章主要介绍了MyBatis注解开发-@Insert和@InsertProvider的使用,具有很好的参考价值,希望对大家有所帮助。
    2022-07-07

最新评论