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;
   }

}
重复的代码最好建一个类,要不然看着就刺眼。

你可能感兴趣的:(java,F#,J#)