工具(十一):随机密码生成工具-可选择字符种类

2023-05-16

工具(十一)随机密码生成工具-可选择字符种类:

在这里插入图片描述

废话少絮,上代码:

一、可选择字符种类随机密码生成工具的实现思路:

  1. 准备好要包含的字符串,去掉易混淆字符;
  2. 随机生成字符串,按照长度,不同类型的字符串随机取;
  3. 将必须出现的字符类型先放到前几个位置,后面的位置随机取;
  4. 将生成的字符打乱顺序,以免前几个字符的类型是固定的导致密码强度降低。

import java.util.*;

/**
 * 随机密码生成工具
 *
 * @author wangdy
 */
public class RandomPwdUtil {

    // 特殊字符
    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        生成密码的长度  建议至少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);
        System.out.println("乱序前:" + resultSb + "-----乱序后:" + stringBuilder);
        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()));
        }
    }

	/**
	* 测试main
	**/
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            // String s = randomPassword(6, false, false, false, false);
            String s = randomPassword(6, true, true, true, true);
            System.out.println("" + s);
        }
    }
}

二、结果查看:

以下为结果输出:

  
乱序前:uC*99=-----乱序后:=9C9u*
=9C9u*
乱序前:jU%67&-----乱序后:%6U7&j
%6U7&j
乱序前:rV@8n&-----乱序后:r&8@nV
r&8@nV
乱序前:xM!37_-----乱序后:7!3Mx_
7!3Mx_
乱序前:gJ!562-----乱序后:g62!J5
g62!J5
乱序前:vA$74s-----乱序后:v$7A4s
v$7A4s
乱序前:jC*4PF-----乱序后:C4jF*P
C4jF*P
乱序前:dU$55$-----乱序后:55$dU$
55$dU$
乱序前:fV%26$-----乱序后:2$6fV%
2$6fV%
乱序前:xA%47*-----乱序后:x4*A%7
x4*A%7
乱序前:nY_3Vx-----乱序后:3VYn_x
3VYn_x
乱序前:nZ#2C7-----乱序后:Zn27#C
Zn27#C
乱序前:uK#94e-----乱序后:#K49eu
#K49eu
乱序前:kE&8@D-----乱序后:k&D@E8
k&D@E8
乱序前:fP_92u-----乱序后:P2_f9u
P2_f9u
乱序前:vD_8ae-----乱序后:8vDae_
8vDae_
乱序前:dG&9%J-----乱序后:&JdG9%
&JdG9%
乱序前:aZ!8hX-----乱序后:X!8Zha
X!8Zha
乱序前:hT&57s-----乱序后:h&s5T7
h&s5T7
乱序前:dU_9=6-----乱序后:Ud_96=
Ud_96=
乱序前:kF%23%-----乱序后:3%2k%F
3%2k%F
乱序前:mE$4_2-----乱序后:42_$mE
42_$mE
乱序前:fJ#5$f-----乱序后:f$J5#f
f$J5#f
乱序前:eD@7P#-----乱序后:P@7#De
P@7#De
乱序前:zD!8S&-----乱序后:z!8S&D
z!8S&D
乱序前:dJ@6%C-----乱序后:@dJ6%C
@dJ6%C
乱序前:sB&6c9-----乱序后:c9Bs6&
c9Bs6&
乱序前:bJ!3FD-----乱序后:!FJbD3
!FJbD3
乱序前:nB#28e-----乱序后:82#neB
82#neB
乱序前:cG!7_9-----乱序后:G!_9c7
G!_9c7
乱序前:cW*6ux-----乱序后:x6uc*W
x6uc*W
乱序前:xZ_93n-----乱序后:3xn9_Z
3xn9_Z
乱序前:yB&2Y3-----乱序后:23yBY&
23yBY&
乱序前:mK@6p4-----乱序后:4p6mK@
4p6mK@
乱序前:eJ@54=-----乱序后:5=@J4e
5=@J4e
乱序前:xY_62*-----乱序后:_xY26*
_xY26*
乱序前:sK$5!p-----乱序后:!$Ksp5
!$Ksp5
乱序前:nN!6ec-----乱序后:nN!6ec
nN!6ec
乱序前:gH%7Xf-----乱序后:%7HgXf
%7HgXf
乱序前:vK*93v-----乱序后:K3v*v9
K3v*v9
乱序前:gZ%38h-----乱序后:Z38g%h
Z38g%h
乱序前:mE_265-----乱序后:6mE5_2
6mE5_2
乱序前:wB@4S%-----乱序后:%wB4@S
%wB4@S
乱序前:rC!7eR-----乱序后:rReC7!
rReC7!
乱序前:eS_3ep-----乱序后:e_e3Sp
e_e3Sp
乱序前:jH!7bM-----乱序后:Mbj!7H
Mbj!7H
乱序前:rY@78j-----乱序后:7Yr8@j
7Yr8@j
乱序前:mW$8pe-----乱序后:$pmeW8
$pmeW8
乱序前:cE%4Yr-----乱序后:4YcE%r
4YcE%r
乱序前:vM@8aJ-----乱序后:v8MaJ@
v8MaJ@
乱序前:fF@5Z*-----乱序后:5Z@*Ff
5Z@*Ff
乱序前:fK@9v5-----乱序后:9Kf5@v
9Kf5@v
乱序前:vF!83%-----乱序后:%3v8!F
%3v8!F
乱序前:xM_3Y@-----乱序后:_Yx@3M
_Yx@3M
乱序前:sP$2%r-----乱序后:rP%$s2
rP%$s2
乱序前:wX@5A$-----乱序后:A$w@5X
A$w@5X
乱序前:kY_6Vn-----乱序后:n_6YkV
n_6YkV
乱序前:wW#7*2-----乱序后:2#W*7w
2#W*7w
乱序前:nJ!6$N-----乱序后:n!N$J6
n!N$J6
乱序前:bJ_4Ed-----乱序后:b_Ed4J
b_Ed4J
乱序前:rS&2J2-----乱序后:2S2&Jr
2S2&Jr
乱序前:jN_8&7-----乱序后:j8_N7&
j8_N7&
乱序前:vV&9G&-----乱序后:v&9V&G
v&9V&G
乱序前:sX!3kt-----乱序后:Xk3st!
Xk3st!
乱序前:tH!97@-----乱序后:@!t9H7
@!t9H7
乱序前:gS#6ya-----乱序后:S6ayg#
S6ayg#
乱序前:eM&635-----乱序后:63e&M5
63e&M5
乱序前:rX$2%*-----乱序后:2X$*%r
2X$*%r
乱序前:zJ=83A-----乱序后:J3z=A8
J3z=A8
乱序前:gR*2NB-----乱序后:*2BRgN
*2BRgN
乱序前:jS=2zc-----乱序后:2Szc=j
2Szc=j
乱序前:pC&5ED-----乱序后:E&DC5p
E&DC5p
乱序前:xJ%89M-----乱序后:8J%9xM
8J%9xM
乱序前:jT!5HB-----乱序后:j5!BHT
j5!BHT
乱序前:dN_7#2-----乱序后:d_2#N7
d_2#N7
乱序前:gE@524-----乱序后:E42g5@
E42g5@
乱序前:fV&9%#-----乱序后:9%&V#f
9%&V#f
乱序前:nK*9jK-----乱序后:9j*nKK
9j*nKK
乱序前:wV!5_*-----乱序后:5!w*V_
5!w*V_
乱序前:eD@53s-----乱序后:@53Dse
@53Dse
乱序前:tD!2s5-----乱序后:!2stD5
!2stD5
乱序前:sB*89_-----乱序后:B8_s*9
B8_s*9
乱序前:gB&2a8-----乱序后:a8&g2B
a8&g2B
乱序前:aE&6z!-----乱序后:!z&6Ea
!z&6Ea
乱序前:tG$8a9-----乱序后:9$taG8
9$taG8
乱序前:tK_8Ke-----乱序后:e8KtK_
e8KtK_
乱序前:gR#84Y-----乱序后:RY8#4g
RY8#4g
乱序前:kD$4@2-----乱序后:4$@D2k
4$@D2k
乱序前:vF=5XF-----乱序后:v5FXF=
v5FXF=
乱序前:pU=77b-----乱序后:pb7U=7
pb7U=7
乱序前:sW=6!Z-----乱序后:W=!Z6s
W=!Z6s
乱序前:aJ&7N@-----乱序后:7JN@a&
7JN@a&
乱序前:bE*639-----乱序后:E*3b96
E*3b96
乱序前:zB%2j*-----乱序后:Bj*z2%
Bj*z2%
乱序前:sR%7=j-----乱序后:j=Rs%7
j=Rs%7
乱序前:pT*9#v-----乱序后:T*p#v9
T*p#v9
乱序前:sM!3!c-----乱序后:3!sMc!
3!sMc!
乱序前:vY#8$7-----乱序后:#$v78Y
#$v78Y
乱序前:nS&7V%-----乱序后:S7n&V%
S7n&V%
乱序前:eS_78H-----乱序后:8SH_e7
8SH_e7

Process finished with exit code 0

以上输出表示密码已经成功输出,并打乱顺序,密码强度很高,可以提高位数的方式增加密码强度。

END

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

工具(十一):随机密码生成工具-可选择字符种类 的相关文章

  • kaggle邮箱不能验证+安装python的Speedml库

    注册kaggle账号遇到一些问题 下面是具体问题和解决方案 希望遇到同样问题的小伙伴不要再踩到坑啦 1kaggle邮箱不能验证You did not enter the correct captcha response Please try
  • 用程序验证生日“悖论”

    生日 悖论 其实并不是悖论 xff0c 它是说在一个人数超过23人的集体中 xff0c 至少有两个人生日在同一天的概率约为0 5 因为这个理论上的概率与人们的直觉不符 xff0c 才会被称为 悖论 我们可以用一个简单的小程序验证它哦 xff
  • python 中 defaultdict 的用法

    场景 xff1a 统计一个字符串列表中每个字符串的频数 一个明显的方法是建立一个键是字符串 xff0c 值是频数的字典 方法1 xff1a word count 61 for word in document if word in word
  • K近邻算法所面临的维数灾难问题

    K近邻算法的基本思想 K近邻算法是一种常用的监督学习方法 xff0c 其原理非常简单 xff1a 给定测试样本 xff0c 基于某种距离找出训练集中与其最靠近的K个训练样本 xff0c 然后基于这K个邻居的信息来进行预测 两个基本要素 xf
  • Android广播发送机制剖析【android广播系列二】

    上篇博客大致说了说广播的注册机制 xff0c 动态注册和静态注册广播的原理还不一样 xff0c 动态广播最后HashMap中了 xff0c 最后放到mReceiverResolver中 xff0c 以后当ActivityManagerSer
  • 观察者模式--Java设计模式

    观察者模式定义 xff1a 定义了对象之间的一对多的依赖 xff0c 这样一来 xff0c 当一个对象发生改变状态的时候 xff0c 它的所有依赖者都会收到通知并自动更新 参考如下图 xff1a 观察者设计模式也叫发布 订阅模式 也可以称作
  • Android——RuntimePermission介绍

    1 介绍 androidM版本上 xff0c 对permission的管理做了部分改动 xff0c 针对dangerous permission xff0c 不在安装的时候给予权限 xff0c 而是在运行过程中咨询用户是否给予app响应的权
  • Android中launcherMode="singleTask"详解【android源码解析六】

    android中launcherMode有4中属性 xff1a standard 默认 xff0c singleTop xff0c singleTask和 singleInstance xff1b 网上有好多例子讲解这四种关系的 xff1a
  • Android闹钟最终版【android源码闹钟解析】

    我以前写了个复杂闹钟的demo xff0c 参见 Android闹钟 复杂版 大明进化十五 但是里面的bug有一些 xff0c 好多人留言 xff0c 所以我就看看源码 xff0c 找找原因 xff1f 顺便把源码代码整理出来 xff0c
  • Smali--Dalvik虚拟机指令语言-->【android_smali语法学习一】

    最近一周在研究rom移植 xff0c 所以就对Smali语言学习了一下 xff0c Smali语言其实就是Davlik的寄存器语言 xff1b Smali语言就是android的应用程序 apk通过apktool反编译出来的都有一个smal
  • 程序员平均月薪过万,想当程序员的话,大学学那些专业会更好呢?

    在互联网时代 xff0c 程序员成为炙手可热的职业 虽然加班累成狗 xff0c 也有可能面临英年早秃的局面 xff0c 但是不得不说程序员的工资高于很多很多传统行业职位的工资 据统计 xff0c 应届程序员毕业生在一线城市平均月薪达到8k
  • android4.0自定义锁屏总结【android锁屏研究一】

    最近搬家了 xff0c 从北京 gt 深圳 xff0c 除了天气有点不同外 xff0c 其他的都差不多 xff0c 工作性质和以前也类似 xff01 纪念一下自己的迁移 题外话 转载请表明出处 xff1a http blog csdn ne
  • android系统锁屏详解【android锁屏解析二】

    谷歌的代码写的确实不错 xff0c 我很幸运 xff0c 一开始接触代码就赶上了谷歌这个开源的系统 xff0c 让我的视野开阔了很多 xff0c 也让我看到了优秀的代码工程师写到的代码 心怀感恩之心 题记 我的有篇文章说了这个锁屏 xff0
  • 单片机学习笔记8--按键和外部中断(基于百问网STM32F103系列教程)

    第八章 按键和外部中断 第一节 按键原理 GPIO内部上拉较弱 xff0c 可根据满足电路需求选择是用内部的上拉还是自己外接上拉 根据原理图可知 xff0c 当按键松开时 xff0c 单片机引脚连接在高电平上 xff0c GPIO口输入高电
  • ARM架构与编程6--重定位(基于百问网ARM架构与编程教程视频)

    一 启动程序流程 我们之前讲过 xff0c 单片机有根据boot的不同 xff0c 有三种启动方式 xff1a boot0boot1启动模式0Xflash启动10系统存储器11内置SRAM 单片机上电复位后 xff0c 运行main函数 以
  • LVGL8.1版本笔记

    之前学过LVGL6 xff0c 现在版本更新到LVGL8了 xff0c 学习下新版本 xff0c 本文主要是记录一些LVGL8的新特性 xff0c 区别和lvgl6的不同之处 lv task handler 的作用 链接 lv task h
  • STM32F407定时器输入捕获

    STM32F407定时器一共有14个 其中分为基本定时器 通用定时器 高级定时器 具体功能如上图所示 下面介绍下输入捕获模式 输入捕获 xff1a 通过检测TIMx CHx上的边沿信号 在边沿信号发生跳变的时候 将当前的定时器的值 TIMx
  • 几种常见的存储器

    存储器分为易失性存储器和非易失性存储器 其中的易失性是指存储器掉电是否能保存数据 易失性存储器 xff1a 就是我们常说的RAM xff0c 这种存储器掉电后所有数据都消失 xff0c 不会被保存 xff0c 重新上电之后 xff0c 原来
  • FreeRTOS初级篇----优先级实验

    FreeRTOS创建任务时 xff0c 可以设置任务的优先级 在FreeRTOS中优先级的值越小 xff0c 优先级越低 xff0c 其他的RTOS都是优先级值越小 xff0c 优先级越高 xff0c 这点需要注意 任务优先级实验 xff1
  • FreeRTOS初级篇----删除任务

    任务既然可以被创建 xff0c 那么自然也可以被删除 xff0c 对于某些执行一次或几次就不需要的任务来说 xff0c 可以在执行完成后 xff0c 把此任务删除 xff0c 可以通过别的任务将其删除 xff0c 也可以任务自己删除自己 任

随机推荐

  • FreeRTOS初级篇----一个函数创建多个任务

    之前说过 xff0c 创建任务的时候 xff0c 可以传递给任务参数 xff0c 下面通过实验 xff0c 对一个任务函数传入不同的参数展示如何使用一个函数创建多个任务 任务函数 xff1a 把传入的数据转换为int型数据然后打印出来 sp
  • 大学生想要通过看书自学编程,却始终没成功,是因为你没有技巧!

    在大学里面 xff0c 有很多的方式来学习编程 xff0c 从在线教程到完成在线课程 xff0c 到密集编程的新手训练营 教程都很棒 xff0c 但它们通常只给你基础知识 与此同时 xff0c 在线教程和线下课程可能非常昂贵 xff0c 虽
  • FreeRTOS初级篇----任务管理

    一 任务状态 再FreeRTOS中 xff0c CPU同一时刻只执行一个任务 xff0c 只不过是所有任务切换的速度特别快 xff0c 默认1ms切换一次任务 xff0c 所以宏观上来看就是CPU再同时运行所有任务 根据任务的执行情况 xf
  • FreeRTOS中级篇

    一 内存管理 1 五种内存管理模式 FreeRTOS提供了5种内存管理实现方法 xff0c 可以根据不同的使用场合选择不同的模式 关于5中内存管理模式可以看下面这篇文章 链接 https zhuanlan zhihu com p 11527
  • LVGL8移植FATFS并适配到STM32F407

    目前LVGL版本已经更新到8 3版本 xff0c FATFS也是在嵌入式领域常用的文件系统 网上许多在LVGL上移植FATFS的教程大都是基于LVGL7版本的 xff0c 而且过程较为凌乱 本文旨在帮助大家了解在LVGL8上移植FATFS文
  • openstack dashboard简体中文汉化

    这里阐述的是fuel工具部署的openstack 环境的dashboard进行简体中文汉化 1 xff09 直接运行 apt get install gettext 命令 2 xff09 转到fuel已经配置好的中文配置文件夹下 cd us
  • 【转】gcc编译错误表

    conversion from s to s not supported by iconv iconv 不支持从 s 到 s 的转换 iconv open iconv open no iconv implementation cannot
  • _tcsstr的用法以及源码的源码

    tcsstr 字符串1在字符串2中首次出现的位置 xff0c 未出现返回NULL值 xff1b tcsrchr xff1a 字符1 在字符串2中首次出现的位置 xff0c 未出现返回NULL值 TCHAR字符串操作函数 xff1a tcsl
  • 修改ElementUI默认滚动条的样式

    一 默认的滚动条 很宽很占地方 xff0c 不美观 xff0c 与页面设计格格不入 二 优化后的滚动条 很美观 xff0c 可以根据实际风格调整颜色 xff0c 宽度 xff0c 高度等 三 优化代码 在全局样式里加入以下代码 xff0c
  • K8S异常之出现大量被驱逐的pod,导致服务无法访问的问题

    一 背景 用kuboard作为k8s管理工具的 xff0c 运行一段时间后 xff0c 访问时 xff0c 浏览器显示以下提示 xff1a 排查问题 1 查看k8s的情况 如下 xff0c 发现正常 root 64 nb001 data k
  • 服务监控(四)之SpringBoot整合Prometheus

    1 新建一个springboot项目 我这里版本是 xff1a 2 2 4 RELEASE xff0c pom中加入如下必要依赖 xff1a span class token comment lt https micrometer io d
  • 服务监控(五)之Grafana 接入Prometheus 的数据实现服务监控

    官方文档 xff1a https prometheus io docs visualization grafana 1 添加Prometheus 数据源 1 1 从下图所示的位置进入 xff0c 添加data source 1 2 点击 A
  • 应用程序运行***buffer overflow detected*** terminated Aborted异常退出问题

    今天运行程序 xff0c 改了一段代码 xff01 然后每次一运行程序就异常退出 xff0c 打印如下信息 xff1a buffer overflow detected shm costomer terminated Aborted 根据单
  • URAM和BRAM有什么区别

    无论是7系列FPGA UltraScale还是UltraScale Plus系列FPGA xff0c 都包含Block RAM xff08 BRAM xff09 xff0c 但只有UltraScale Plus芯片有UltraRAM也就是我
  • 服务监控(六)之Prometheus接入mysqld_exporter使用Grafana监控MySQL

    需准备的前置内容 xff1a 1 Prometheus安装配置 直通车 xff1a https blog csdn net wdy 2099 article details 124204720 2 Grafana安装配置 直通车 xff1a
  • CentOS7 升级OpenSSH9.0全过程和坑

    近日 xff0c 漏洞肆虐 xff0c 需要升级新版本 xff0c 才能解决漏洞 故有此文 xff1a 0 查看当前版本 span class token punctuation span root 64 host testsvc open
  • Gradle下载安装

    Gradle 官网地址 xff1a https gradle org releases 一 下载 访问上述地址https gradle org releases 选择下载 xff0c binary only 和 complete都可以 下载
  • Gradle 新建项目及Gradle常用命令&镜像源修改

    一 Gradle 项目的目录结构说明 xff1a 二 创建 Gradle 项目 用idea创建 xff0c 按图示步骤即可 创建完项目后 xff0c 配置gradle的安装目录 xff1a 创建完成后的gradle项目的目录结构 xff0c
  • Transfer-Encoding: chunked添加Content-Length: 574712返回

    一 问题背景 xff1a 开发中有时候有的功能需要返回content length字段 xff0c 根据此字段进行下载进度的展示 而springboot默认在数据量大的时候是进行了Transfer Encoding chunked 设置的
  • 工具(十一):随机密码生成工具-可选择字符种类

    工具 xff08 十一 xff09 随机密码生成工具 可选择字符种类 废话少絮 xff0c 上代码 xff1a 一 可选择字符种类随机密码生成工具的实现思路 xff1a 准备好要包含的字符串 xff0c 去掉易混淆字符 xff1b 随机生成