2

ランダムなパスワード生成用のコードを書きました。パスワードを作成する必要がある場所から文字列があります。そのため、大文字の配列、小文字の配列、数字の配列に従って文字列を分類しようとしています。しかし、ここで問題が発生します..

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

実行すると、不要なスペースがカウントされます。コーディングが貧弱なため、コーディングは醜いように見えます。それを解決する方法は他にもたくさんあることは知っていますが、これを試してみたいと思います。これが私のコードです。ここに私のコードがあります

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

4 に答える 4

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());
}
于 2013-01-22T12:56:50.020 に答える
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$*
于 2013-01-22T13:23:47.527 に答える
1

間違っていなければ、生成されたパスワードを解析して別の配列に入れたいと思います。これは大文字のスニペットです。

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

char pass[] = password.toCharArray();
for(char c: pass){
   if(Character.isUpperCase(c))
         uppercase.add(c);
}
于 2013-01-22T13:25:48.900 に答える
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);

「randomString」の不要な文字を「randomString1」の文字に置き換えます。必要に応じて、これを繰り返すことができます。

最小サイズ/スプレッドを気にしない場合は、文字を削除できます。

幸運を。

于 2013-01-22T13:26:58.147 に答える