Java生成随机密码串的两种方法

群里有朋友提出的问题:

功能
生成随机密码串;
要求
密码串类型可以是纯数字,纯字符,或混合数字、字符和其他符号。
密码串类型和密码串长度在运行时指定。
生成密码串的个数在运行时指定。

看到群里没人贴完整功能的代码,可能是对此题不屑一顾,于是自己就帮忙写了。(初学者可以参考下)

/*
* assignType方法控制密码串的类型,str存放的是密码串中可能存在的字符
*/

package com.yby;


public class StrType {

public static String assignType(int type){


String str="";
while(true){
switch(type){
case 1:
for(int i=0;i<=9;i++){ //纯数字
str=str+i;
}
return str;
case 2:
for(int i=33;i<127;i++){
if(i<58&&i>47){ //排除数字
continue;
}

str=(char)i+str;
System.out.println(str);
}
return str;
case 3:
for(int i=33;i<127;i++){ //数字和字符混合
str=(char)i+str;
}
return str;
default:
System.out.println("输入错误,程序退出!");
System.exit(1);
}

}

}
}

=========================================

/*
* 得到密码串
*/

package com.yby;

import java.util.Random;

public class GetPwd {

public static String getpass(String str, int length) {
String pwd = "";
Random rand = new Random();
char[] chr = str.toCharArray();

for (int i = 0; i < length; i++) { // 控制密码的长度
int j = rand.nextInt(chr.length); // 随机产生字符数组下标
pwd = pwd + chr[j];
}
return pwd;
}
}
=========================================

/*
* 得到密码串数组
*/

package com.yby;


public class StrPwd {
public static String[] strPwd(String str, int length,int num){


String[] strpwd= new String[num];
for(int i=0;i<num;i++){
String pwd=GetPwd.getpass(str, length);
strpwd[i]=pwd;
}

return strpwd;
}
}

=========================================
/*
* 打印产生的密码串
*/

package com.yby;

public class printPwd {
public static void printpass(String[] pwd){
for(int i=0;i<pwd.length;i++){
System.out.println(pwd[i]);
}
}
}
=========================================

/*
* 测试类
*/
package com.yby.test;

import java.util.Scanner;

import com.yby.GetPwd;
import com.yby.StrPwd;
import com.yby.StrType;
import com.yby.printPwd;

public class Test {

public static void main(String[] args) {
Scanner output = new Scanner(System.in);
System.out.println("请输入密码串的类型(1.纯数字 2.纯字符 3.混合数字、字符和其他符号)");
int type = output.nextInt();
String str = StrType.assignType(type);
System.out.println("请输入密码长度:");
int length = output.nextInt();
String pwd = GetPwd.getpass(str, length);
System.out.println("请输入要产生的密码串个数:");
int num = output.nextInt();
String strpwd[] = StrPwd.strPwd(pwd, length, num);
// 打印
printPwd.printpass(strpwd);

}

}

另外一种方法:

就是把需要的字符全部放在一个字符数组中,再在字符数组中随机取出字符组成密码串。此方法的好处就是想要什么特殊字符,自己添加,后面的代码作只需少许改动。

/*自己写测试类测试下

package test;

import java.util.Random;

public class Getpass {

private static char[] chars = { '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
'y', 'z', 'A', 'B','C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
'Z','!','@','#','$','%','^','&','*','~','|'}; //72个字符集

/**
*
* @param passLength
* 随机密码长度
* @param count
* 随机密码个数
* @return 随机密码数组
*/
public static String[] getPasswords(int type,int passLength, int count) {
String[] passwords = new String[count];// 新建一个长度为指定需要密码个数的字符串数组
Random random = new Random();
if(type==1){
for (int i = 0; i < count; i++) {// 外循环 从0开始为密码数组赋值 也就是开始一个一个的生成密码
StringBuilder password = new StringBuilder("");// 保存生成密码的变量
for (int m = 1; m <= passLength; m++) {// 内循环 从1开始到密码长度 正式开始生成密码
password.append(chars[random.nextInt(10)]);// 为密码变量随机增加上面字符中的一个
}
passwords[i] = password.toString();// 将生成出来的密码赋值给密码数组
}
}
else if(type==2){
for (int i = 0; i < count; i++) {// 外循环 从0开始为密码数组赋值 也就是开始一个一个的生成密码
StringBuilder password = new StringBuilder("");// 保存生成密码的变量
for (int m = 1; m <= passLength; m++) {// 内循环 从1开始到密码长度 正式开始生成密码
password.append(chars[random.nextInt(53)+10]);// 为密码变量随机增加上面字符中的一个
}
passwords[i] = password.toString();// 将生成出来的密码赋值给密码数组
}
}
else if(type==3){
for (int i = 0; i < count; i++) {// 外循环 从0开始为密码数组赋值 也就是开始一个一个的生成密码
StringBuilder password = new StringBuilder("");// 保存生成密码的变量
for (int m = 1; m <= passLength; m++) {// 内循环 从1开始到密码长度 正式开始生成密码
password.append(chars[random.nextInt(72)]);// 为密码变量随机增加上面字符中的一个
}
passwords[i] = password.toString();// 将生成出来的密码赋值给密码数组
}
}
else{
System.out.println("输入错误!");
}

return passwords;
}

}
重复的代码最好建一个类,要不然看着就刺眼。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值