Java 随机生成密码包含大写字母、数字、特殊字符且指定长度

一、写在前面

现在网络环境越来越复杂,对密码安全要求也越来越严格,在生产环境种,对密码要求是一个不少于16位的随机密码,要求含有大写字母、小写字母、数字、特殊字符中的三种。我们使用java代码直接来可控的生成这种密码。

二、上代码

PasswordGenerator.java

直接修改下面的数字,来控制大写字母、小写字母、数字、特殊字符的数量,以及密码的长度。

int passwordLength = 16; // 密码长度
int lowerCaseCount = 1; // 小写字母数量
int upperCaseCount = 1; // 大写字母数量
int numberCount = 1; // 数字数量
int specialCount =1; // 特殊字符数量

package com.demo.tool.passwd;

import java.security.SecureRandom;

public class PasswordGenerator {

	private static final String LOWERCASE_CHARACTERS = "abcdefghijklmnopqrstuvwxyz";
	
    private static final String UPPERCASE_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    
    private static final String DIGITS = "0123456789";
    
    private static final String SPECIAL_CHARACTERS = "!@#$%^&*_=+-/";
    
    private static final String ALL_CHARACTERS = LOWERCASE_CHARACTERS + UPPERCASE_CHARACTERS + DIGITS;
    

	public static void main(String[] args) {
		// 一次性生成的密码数量
		int passwordCount = 10;
		for (int i = 0; i < passwordCount; i++) {
			// 打印每次生成的密码
			System.out.println(generatePassword());
        }
	}

	/**
	 * @Description: 生成含有指定小写字母、大写字母和数字字符以及特殊字符数量和固定长度的随机密码
	 * @author EXT.AZHANG
	 * @return String
	 * @date 2024-08-12
	 */
	private static String generatePassword() {
		
		int passwordLength = 16; // 密码长度
		// 确保至少包含一个小写字母、一个大写字母和一个数字字符以及一个特殊字符 把数量都设置为1
		int lowerCaseCount = 1; // 小写字母数量
		int upperCaseCount = 1; // 大写字母数量
		int numberCount = 1; // 数字数量
		int specialCount =1; // 特殊字符数量
        StringBuilder randomString = new StringBuilder(passwordLength);
        SecureRandom random = new SecureRandom();
        // 随机生成大写字母部分
        for (int i = 0; i < lowerCaseCount; i++) {
            int lowerCaseIndex = random.nextInt(LOWERCASE_CHARACTERS.length());
            randomString.append(LOWERCASE_CHARACTERS.charAt(lowerCaseIndex));
        }
        // 随机生成小写字母部分
        for (int i = 0; i < upperCaseCount; i++) {
            int upperCaseIndex = random.nextInt(UPPERCASE_CHARACTERS.length());
            randomString.append(UPPERCASE_CHARACTERS.charAt(upperCaseIndex));
        }
        // 随机生成数字部分
        for (int i = 0; i < numberCount; i++) {
            int digitsIndex = random.nextInt(DIGITS.length());
            randomString.append(DIGITS.charAt(digitsIndex));
        }
        // 随机生成特殊字符部分
        for (int i = 0; i < specialCount; i++) {
            int specialIndex = random.nextInt(SPECIAL_CHARACTERS.length());
            randomString.append(SPECIAL_CHARACTERS.charAt(specialIndex));
        }
        // 生成剩余的字符
        for (int i = lowerCaseCount+upperCaseCount+numberCount+specialCount; i < passwordLength; i++) {
        	// 在所有字符里面取剩下的字符
            randomString.append(ALL_CHARACTERS.charAt(random.nextInt(ALL_CHARACTERS.length())));
        }
        // 洗牌字符,使其顺序随机
        return shuffleString(randomString.toString());
	}
	
	/**
	 * 
	 * @Description: 函数用于洗牌字符串中的字符
	 * @author EXT.AZHANG
	 * @param input
	 * @return String
	 * @date 2024-08-12
	 */
    private static String shuffleString(String input) {
    	 SecureRandom random = new SecureRandom();
        char[] characters = input.toCharArray();
        for (int i = characters.length - 1; i > 0; i--) {
            int randomIndex = random.nextInt(i + 1);
            char temp = characters[i];
            characters[i] = characters[randomIndex];
            characters[randomIndex] = temp;
        }
        return new String(characters);
    }
    
}
三、运行结果

一次性随机生成10个符合要求的密码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值