随机密码生成

时间:2013-01-22 12:53:31

标签: java

我已经为随机密码生成编写了一个代码。有一个字符串,我必须在哪里制作密码。所以我尝试根据大写数组,小写数组和数字数组对字符串进行分类。但是这里出现问题..

         for(int k=0;k<Length;k++){
        if(asc[k]>=65 && asc[k]<=90){
            UpperCase[k]=(char)asc[k];
        }
        else if(asc[k]>=48 && asc[k]<=57){
            Digit[k]=(char)asc[k];
        }
        else {
            Mixed[k]=(char)asc[k];
        }
    } 

被执行它计算了一些我不想要的空间。编码对于我糟糕的编码看起来像丑陋的sry。我知道有很多方法可以解决它但我想要通过这个。我的代码就是这样。这是我的代码

import java.util.Random;

   public class Randompassgeneration
   {

final int MAX_LENGTH = 20;
final int MIN_LENGTH = 3;

char[] password=new char[25];
int [] asc=new int[18];
char[] UpperCase=new char[25];
char[] Digit=new char[25];
char[] Mixed=new char[25];
public void generate(String allowedCharacters)
{
    int Length=allowedCharacters.length();


    for (int i=0;i<Length;i++)
    {
        asc[i]=(int)allowedCharacters.charAt(i);

    }
    for (int k=0;k<Length;k++)
    {
        if (asc[k]>=65 && asc[k]<=90)
        {
            UpperCase[k]=(char)asc[k];
        }
        else if (asc[k]>=48 && asc[k]<=57)
        {
            Digit[k]=(char)asc[k];
        }
        else
        {
            Mixed[k]=(char)asc[k];
        }
    }

    String rp=null;
    StringBuilder Strbld=new StringBuilder();
    Random rnd=new Random();
    int ranStrLen=rnd.nextInt(MAX_LENGTH - MIN_LENGTH + 1) + MIN_LENGTH;
    Strbld.append(UpperCase[rnd.nextInt(UpperCase.length)]);
    Strbld.append(Digit[rnd.nextInt(Digit.length)]);

    for (int m=0; m<ranStrLen-2; m++)
    {
        Strbld.append(Mixed[rnd.nextInt(Mixed.length)]);

    }

    System.out.print(ranStrLen +"->"+ Strbld.toString());


}

public static void main(String[] args)
{
    String allowedCharacters = "weakPasSWorD1234$*";
    Randompassgeneration t=new Randompassgeneration();
    t.generate(allowedCharacters);
}
}

有什么建议吗?

4 个答案:

答案 0 :(得分:2)

我会生成最少数量的字符,数字和符号。随机填写其他字符并随机填充结果。这样,它将以最少的努力符合您的最低要求。

public static String passwordGenerator() {
    List<Character> chars = new ArrayList<>();
    Random rand = new Random();
    // min number of digits
    for (int i = 0; i < 1; i++) chars.add((char) ('0' + rand.nextInt(10)));
    // min number of lower case
    for (int i = 0; i < 2; i++) chars.add((char) ('a' + rand.nextInt(26)));
    // min number of upper case
    for (int i = 0; i < 1; i++) chars.add((char) ('A' + rand.nextInt(26)));
    // min number of symbols
    String symbols = "!\"$%^&*()_+{}:@~<>?,./;'#][=-\\|'";
    for (int i = 0; i < 1; i++) chars.add(symbols.charAt(rand.nextInt(symbols.length())));
    // fill in the rest
    while (chars.size() < 8) chars.add((char) ('!' + rand.nextInt(93)));
    // appear in a random order
    Collections.shuffle(chars);
    // turn into a String
    char[] arr = new char[chars.size()];
    for (int i = 0; i < chars.size(); i++) arr[i] = chars.get(i);
    return new String(arr);
}

public static void main(String... args) {
    for (int i = 0; i < 100; i++)
        System.out.println(passwordGenerator());
}

答案 1 :(得分:1)

执行

“它会计算一些我不想要的空间”

您的For loop

是空白空间

您对所有数组使用变量k,每次都会导致k递增值。因此,这会在数组之间产生“差距”。

将其更改为:

int point1=0,point2=0,point3=0;
for (int k=0;k<Length;k++)
{
    if (asc[k]>=65 && asc[k]<=90)
    {
        UpperCase[point1]=(char)asc[k];point1++;
        continue;
    }
    else if (asc[k]>=48 && asc[k]<=57)
    {
        Digit[point2]=(char)asc[k];point2++;
        continue;
    }
    else
    {
        Mixed[point3]=(char)asc[k];point3++;
    }

}
System.out.println(UpperCase);
System.out.println(Digit);
System.out.println(Mixed);

输出:

PSWD
1234
weakasor$*

答案 2 :(得分:1)

好的,如果没有弄错,你想要解析生成的密码,并希望将它们放在单独的数组中。这是大写的片段。

ArrayList<Character> uppercase = new ArrayList<Character>();

char pass[] = password.toCharArray();
for(char c: pass){
   if(Character.isUpperCase(c))
         uppercase.add(c);
}

答案 3 :(得分:1)

如果你想要一个随机字符串,你可以这样做:

public String getRandomString(){
    return UUID.randomUUID().toString();
}

如果你想让它与某些源字符串保持一致,你可以这样做:

public String getConsistentHash(String source){
    return UUID.nameUUIDFromBytes(source.getBytes()).toString();
}

后一种方法将为相同的源字符串返回相同的字符串。

如果您只想使用一组有限的字符,则可以只替换不需要的字符。假设您已经创建了“randomString”,您可以创建“randomString1”,其中包含:

randomString1 = UUID.fromString(randomString);

现在用“randomString1”中的字符替换“randomString”中不需要的字符。如有必要,您可以重复此操作。

如果您不关心最小尺寸/差价,您可以删除字符。

祝你好运。