随机密码生成工具类(java)

简介: 随机密码生成工具类(java)

实现为用户生成随机密码需求,类似如下:

 

package com.cmict.yywzx.common.core.utils;
 
import java.util.*;
 
/**
 * 随机密码生成工具 *
 */
public class PasswordUtil {
 
    // 特殊字符
    private static final String SPECIAL_CHARS = "!@#$%&*_=";
    // 去掉I、L、O、Q易混淆字符
    private static final String UPPER_WORD_CHARS = "ABCDEFGHJKMNPRSTUVWXYZ";
    // 去掉i、l、o、q易混淆字符
    private static final String LOWER_WORD_CHARS = "abcdefghjkmnprstuvwxyz";
    // 去掉1、0易混淆字符
    private static final String NUMBER_CHARS = "23456789";
 
 
    /**
     * 生成固定长度的复杂密码
     * @param length
     * @return
     */
    public static String randomPassword(int length){
        return randomPassword(length,true,true,true,true);
    }
 
    /**
     * @param length        生成密码的长度  建议至少6位
     * @param isLowerWord   是否包含小写字母
     * @param isUpperWord   是否包含大写字母
     * @param isSpecialChar 是否包含特殊字符
     * @param isNum         是否包含数字
     * @return String 随机密码
     * @description: 生成随机密码的工具方法
     */
    public static String randomPassword(int length, Boolean isLowerWord, Boolean isUpperWord, Boolean isSpecialChar, Boolean isNum) {
        Random rnd = new Random();
        // 先取必填项1个
        Map<Integer, String> map = new HashMap<>();
        if (isLowerWord) {
            map.put(1, LOWER_WORD_CHARS);
        }
        if (isUpperWord) {
            map.put(2, UPPER_WORD_CHARS);
        }
        if (isSpecialChar) {
            map.put(3, SPECIAL_CHARS);
        }
        if (isNum) {
            map.put(4, NUMBER_CHARS);
        }
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<Integer, String> entry : map.entrySet()) {
            String value = entry.getValue();
            sb.append(value.charAt(rnd.nextInt(value.length())));
        }
        char[] chars = new char[length - sb.length()];
        for (int i = 0; i < length - sb.length(); i++) {
            chars[i] = nextChar(rnd, isLowerWord, isUpperWord, isSpecialChar, isNum);
        }
        StringBuilder resultSb = sb.append(new String(chars));
        // 对结果数据乱序处理(前面固定放到前几个了,故需乱序)
        String[] split = resultSb.toString().split("");
        List<String> strings = Arrays.asList(split);
        Collections.shuffle(strings);
        StringBuilder stringBuilder = new StringBuilder(strings.size());
        strings.forEach(stringBuilder::append);
        return stringBuilder.toString();
    }
 
 
    private static char nextChar(Random rnd, Boolean isLowerWord, Boolean isUpperWord, Boolean isSpecialChar, Boolean isNum) {
        List<Integer> list = new ArrayList<>();
        if (isLowerWord) {
            list.add(1);
        }
        if (isUpperWord) {
            list.add(2);
        }
        if (isSpecialChar) {
            list.add(3);
        }
        if (isNum) {
            list.add(4);
        }
        if (list.size() == 0) {
            // 默认数字密码
            list.add(4);
        }
 
        // 随机list索引
        int index = rnd.nextInt(list.size());
        Integer integer = list.get(index);
        switch (integer) {
            case 1:
                return LOWER_WORD_CHARS.charAt(rnd.nextInt(LOWER_WORD_CHARS.length()));
            case 2:
                return UPPER_WORD_CHARS.charAt(rnd.nextInt(UPPER_WORD_CHARS.length()));
            case 3:
                return SPECIAL_CHARS.charAt(rnd.nextInt(SPECIAL_CHARS.length()));
            default:
                return NUMBER_CHARS.charAt(rnd.nextInt(NUMBER_CHARS.length()));
        }
    }
 
}
 
相关文章
|
1月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
104 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
1月前
|
Java
Java 些许公共工具类
Java 些许公共工具类
14 1
|
1月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
126 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
3月前
|
缓存 前端开发 Java
【前端学java】java基础巩固复习巩固语法练习-工具类的封装(14)
【8月更文挑战第10天】java基础巩固,工具类的封装
26 1
【前端学java】java基础巩固复习巩固语法练习-工具类的封装(14)
|
3月前
|
Java
Java应用结构规范问题之在UnitConvertUtils工具类将千米转换为米的问题如何解决
Java应用结构规范问题之在UnitConvertUtils工具类将千米转换为米的问题如何解决
|
3月前
|
Java API 数据安全/隐私保护
【Azure Developer】使用 adal4j(Azure Active Directory authentication library for Java)如何来获取Token呢 (通过用户名和密码方式获取Access Token)
【Azure Developer】使用 adal4j(Azure Active Directory authentication library for Java)如何来获取Token呢 (通过用户名和密码方式获取Access Token)
|
3月前
|
存储 设计模式 安全
Java GenericObjectPool 对象池化技术--SpringBoot sftp 连接池工具类
Java GenericObjectPool 对象池化技术--SpringBoot sftp 连接池工具类
51 0
|
4月前
|
设计模式 缓存 安全
Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
41 0
|
4月前
|
设计模式 存储 缓存
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
Java面试题:结合建造者模式与内存优化,设计一个可扩展的高性能对象创建框架?利用多线程工具类与并发框架,实现一个高并发的分布式任务调度系统?设计一个高性能的实时事件通知系统
55 0
|
4月前
|
设计模式 并行计算 安全
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
50 0