原因

初衷:我本来是想写根据自己定义的一些信息生成复杂度可自选的固定密码,增强密码的复杂性的同时,也更容易记住密码,这样密码即使明文记录在本地,没有自己的加密算法,也得不到最终真正的密码。我看到网上有一些现成的工具以及chrome的插件等,还是想自己试试。

不过看到一些自动生成随机密码的网站,一好奇就先有了这篇随机生成密码的文章。

目标

可以选择数字,小写字母,大写字母,特殊符号,密码长度,根据这些选择生成随机的密码。

思路

思路1: 我的思路其实很简单粗暴,密码组成可以有数字,小写字母,大写字母,特殊符号4种选择,所以可以选择其中的1种,2种,3种,4种组成密码,分别对应的组合方式有4种,6种,4种,1种,其实就是简单的排列组合。然后根据选择了几种字符种类,就生成和为密码长度的几个随机数,然后到相应的字符种类中随机选择几个字符,把他们拼接在一起,最后打乱组成新密码。

例如:选择数字和小写字母组成长度为 10 的随机密码,程序会生成和为 10 的两个随机数,假设两个随机数是 4 和 6,则会从 0-9 十个数字和 a-z 26小写字母中中随机的选择 4 个数字和 6 个字母,然后把他们拼接在一起,最后打乱顺序就得到最终的随机密码。

我的想法很简单,如果有更好的方法,求告知,谢谢!

思路2: 另一种生成随机密码的方法,先拼装所有可能组成密码的字符类型,然后随机选择指定长度的n个字符,然后拿着这n字符校验是否包含选择了的字符类型的字符和是否不包含没有选择的字符类型的字符,这样不断重试,直到找到符合选择的字符类型字符串为止。这种方法可能重试的次数比较多,实现参考: https://github.com/lynchnf/password

思路1代码实现

package fun;import java.util.*;/*** Created by gary on 16/10/15.*/
public class GeneratePassword {private static String number = "0123456789";private static String lowerChar = "abcdefghijklmnopqrstuvwxyz";private static String upperChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";private static String specialChar = "*$%!:;.,?&(-_)=#{[@]}";/*** 四种字符十五种组合方式随机产生密码* @param isNum* @param isLowerChar* @param isUpperChar* @param isSpecialChar* @param length* @return*/private static String generPassword(boolean isNum, boolean isLowerChar, boolean isUpperChar, boolean isSpecialChar,int length) {String password = null;// 只选一种if (isNum && !(isLowerChar || isUpperChar || isSpecialChar))return genPwByNum(1, length, number);if (isLowerChar && !(isNum || isUpperChar || isSpecialChar))return genPwByNum(1, length, lowerChar);if (isUpperChar && !(isLowerChar || isNum || isSpecialChar))return genPwByNum(1, length, upperChar);if (isSpecialChar && !(isLowerChar || isUpperChar || isNum))return genPwByNum(1, length, specialChar);// 选择了两种if ((isNum && isLowerChar) && !(isUpperChar || isSpecialChar))return genPwByNum(2, length, number, lowerChar);if ((isNum && isUpperChar) && !(isLowerChar || isSpecialChar))return genPwByNum(2, length, number, upperChar);if ((isNum && isSpecialChar) && !(isLowerChar || isUpperChar))return genPwByNum(2, length, number, specialChar);if ((isLowerChar && isUpperChar) && !(isNum || isSpecialChar))return genPwByNum(2, length, lowerChar, upperChar);if ((isLowerChar && isSpecialChar) && !(isNum || isUpperChar))return genPwByNum(2, length, lowerChar, specialChar);if ((isUpperChar && isSpecialChar) && !(isNum || isLowerChar))return genPwByNum(2, length, upperChar, specialChar);// 选择了三种if ((isNum && isLowerChar && isUpperChar) && !isSpecialChar)return genPwByNum(3, length, number, lowerChar, upperChar);if ((isNum && isLowerChar && isSpecialChar) && !isUpperChar)return genPwByNum(3, length, number, lowerChar, specialChar);if ((isNum && isUpperChar && isSpecialChar) && !isLowerChar)return genPwByNum(3, length, number, upperChar, specialChar);if ((isLowerChar && isUpperChar && isSpecialChar) && !isNum)return genPwByNum(3, length, lowerChar, upperChar, specialChar);// 四种都选if (isNum && isLowerChar && isUpperChar && isSpecialChar)return genPwByNum(4, length, number, lowerChar, upperChar, specialChar);return password;}/*** 根据选择的字符类型生成密码* @param num* @param length* @param keys* @return*/public static String genPwByNum(int num, int length, String... keys) {StringBuilder stringBuilder = new StringBuilder();if (length < num) {return stringBuilder.append("length should be bigger than ").append(num - 1).toString();}int[] randArray = randArr(num, length);int i = 0;for (String str : keys)stringBuilder.append(collectStr(randArray[i++], str));return shuffleString(stringBuilder.toString());}/*** 产生和为length的num个随机数* @param num* @param length* @return*/public static int[] randArr(int num, int length) {Random random = new Random();int[] randArray = new int[num];int i = 0;if (num == 1) {randArray[i] = length;} else {while (num > 1) {int rand = random.nextInt(length - num + 1) + 1;randArray[i++] = rand;length -= rand;num--;if (num == 1) {randArray[i] = length;}}}for (int m : randArray) {System.out.println(m);}return randArray;}/*** 随机拼装字符* @param length* @param sample* @return*/public static String collectStr(int length, String sample) {StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i < length; i++) {stringBuilder.append(sample.charAt((int) (Math.random() * sample.length())));}return stringBuilder.toString();}/*** 打乱字符串* @param str* @return*/public static String shuffleString(String str) {StringBuilder stringBuilder = new StringBuilder();List<String> list = Arrays.asList(str.split(""));Collections.shuffle(list);for (String s : list) {stringBuilder.append(s);}return stringBuilder.toString();}public static void main(String[] args) {String password = generPassword(true, true, true, true, 10);System.out.println(password);// randArr(4, 10);}
}

根据字符类型和密码长度随机生成密码相关推荐

  1. PTA13、随机生成密码 (10 分)

    13.随机生成密码 (10 分) 新建一个字符列表,这个列表中的内容从前到后依次包含小写字母.大写字母.数字. 形如['a',...,'z','A',...,'Z','0',...'9'] 建议:使用 ...

  2. php随机生成密码函数

    /*** 随机生成密码函数* @param int $length 密码长度* @return string*/ function generate_password($length = 8) {// ...

  3. python 随机生成密码

    python 随机生成密码 #!/usr/bin/env python # -*- encoding: utf-8 -*- """ @Introduce : 随机生成密码 ...

  4. Shell脚本批量创建用户并随机生成密码

    Shell脚本批量创建用户并随机生成密码 要求:批量创建10个系统账号oldboy01-oldboy10,并设置生成密码(密码不同). 实现脚本: #!/bin/bash #Question3 for ...

  5. python彩票生成_python3学习--随机生成密码、随机生成彩票号

    ################随机生成密码##################### 1.写一个函数:函数的功能是生成一批密码,存到文件里面 def gen_password(num): #num ...

  6. linux生成数字命令,Linux下随机生成密码的命令

    mkpasswd命令 -l  定义生成密码的长度,默认9 -d  定义密码里面包含数字的最少个数,默认2 -c  定义密码里面包含小写字母的最少个数,默认2 -C  定义密码里面包含大写字母的最少个数 ...

  7. 生成linux命令,详解Linux下随机生成密码的命令总结

    有时候经常为如何设置一个安全.符合密码复杂度的密码而绞尽脑汁,说实话,这实在是一个体力活而且浪费时间,更重要的是设置密码的时候经常纠结.终于有一天实在忍不住了,于是学习.整理了一下如何使用Linux下 ...

  8. Linux下随机生成密码的命令总结

    有时候经常为如何设置一个安全.符合密码复杂度的密码而绞尽脑汁,说实话,这实在是一个体力活而且浪费时间,更重要的是设置密码的时候经常纠结.终于有一天实在忍不住了,于是学习.整理了一下如何使用Linux下 ...

  9. python随机生成密码字符串_Python随机生成带特殊字符的密码

    在日常运维中,如果涉及到用户管理,就一定会用到给用户设置密码的工作,其实吧,平时脑子里觉得设置个密码没什么,但要真让你随手敲一个12位带特殊字符的随机密码,也是很痛苦的事,如果让你敲10个这样的随机密 ...

最新文章

  1. 第十五周程序阅读-范型程序设计(4)
  2. Silverlight实例教程 – Datagrid,Dataform数据验证和ValidationSummary
  3. spice server dpkg-buildpackage 打包编译备忘
  4. 2 172.02 php,kafka安装、相关命令以及PHP使用
  5. 紫书搜索 例题7-10 UVA - 11212 Editing a Book 迭代加深搜索 IDA*
  6. 【SQL Alchemy】AttributeError: '...' object has no attribute 'translate'错误的解决
  7. JSP JavaBean
  8. js正则表达式限制文本框只能输入数字,小数点,英文字母
  9. 我的AJAX 学习系列文章
  10. linux应用小技巧
  11. 让你的echo带颜色
  12. timezone java_如何将Java日期转换为特定的TimeZone格式
  13. VC6 ODBC 例子 之一
  14. 使用Hex2Bin软件将Hex文件转Bin文件
  15. BT.1120数据流解释
  16. ARM到底是一家什么样的公司?
  17. 解决python3+selenium+chromedriver运行时chrome浏览器闪退问题
  18. 打印机不打印计算机原因,打印机打印不完整?是这10个原因造成的!打印必备...
  19. R语言使用vcd包的assocstats函数计算两个分类变量的相关性的强弱、计算列联表的Phi系数、列联系数和Cramer’s V系数
  20. mark一下江南一点雨的微人事开源项目

热门文章

  1. 基于深度卷积神经网络的图像网络分类
  2. 深入浅出Android开发!零基础如何成为高级Android开发,成功拿下大厂offer
  3. 如何在Vscode中安装Python库
  4. SYN Flood DNS Query Flood HTTP Flood DDoS CC常见网络功击
  5. 如何学习使用Bert预训练模型
  6. The Cross-section of Expected Stock Return 1992翻译(续)
  7. 关于大学生恋爱观的调查
  8. 内存优化二Bitmap优化
  9. 2022年全国职业技能大赛中职组“网络安全”赛项— A1模块(超详细解析)
  10. macbook触摸板拖拽不好用?复制选中难?教你两个设置,从此告别鼠标