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强密码校验算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot2.6.3集成quartz的方式

    SpringBoot2.6.3集成quartz的方式

    quartz是java里头定时任务的经典开源实现,这里讲述一下如何在SpringBoot2.6.3集成quartz,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2022-02-02
  • Java模板方法模式定义算法框架

    Java模板方法模式定义算法框架

    Java模板方法模式是一种行为型设计模式,它定义了一个算法框架,由抽象父类定义算法的基本结构,具体实现细节由子类来实现,从而实现代码复用和扩展性
    2023-05-05
  • Java 生产者/消费者问题实例详解

    Java 生产者/消费者问题实例详解

    这篇文章主要实例分析了java中生产者消费者问题的方法,需要的朋友可以可以参考下
    2017-04-04
  • Java的非阻塞队列ConcurrentLinkedQueue解读

    Java的非阻塞队列ConcurrentLinkedQueue解读

    这篇文章主要介绍了Java的非阻塞队列ConcurrentLinkedQueue解读,在并发编程中,有时候需要使用线程安全的队列,如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法,需要的朋友可以参考下
    2023-12-12
  • 10个实现Java集合,Map类型自由转换的实用工具方法

    10个实现Java集合,Map类型自由转换的实用工具方法

    这篇文章主要为大家整理了整理了10个实用工具方法,可以满足 Collection、List、Set、Map 之间各种类型转化,文中的示例代码讲解详细,需要的可以参考下
    2023-09-09
  • Java中string和int的互相转换问题

    Java中string和int的互相转换问题

    本文通过实例代码给大家详细介绍了Java中string和int的互相转换问题,感兴趣的朋友一起看看吧
    2017-10-10
  • Spring Boot系列教程之7步集成RabbitMQ的方法

    Spring Boot系列教程之7步集成RabbitMQ的方法

    RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用。下面这篇文章主要给大家介绍了关于Spring Boot之7步集成RabbitMQ的相关资料,需要的朋友可以参考下
    2018-11-11
  • mybatis注入Date日期值为null的解决方法

    mybatis注入Date日期值为null的解决方法

    这篇文章主要给大家介绍了关于mybatis注入Date日期值为null的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • Hibernate实现many-to-many的映射关系

    Hibernate实现many-to-many的映射关系

    今天小编就为大家分享一篇关于Hibernate实现many-to-many的映射关系,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • 关于Gateway网关中配置跨域的三种方案

    关于Gateway网关中配置跨域的三种方案

    文章总结:介绍了三种处理跨域请求的方法:在Controller类上添加注解、通过配置类实现重写WebMvcConfigurer接口和在配置文件中统一设置,希望这些方法能帮助读者解决跨域问题
    2024-11-11

最新评论