web-dev-qa-db-ja.com

Javaで最小の特殊文字要件で安全なランダムパスワードを生成する

Javaでシステムの長さと文字セットの要件を満たすランダムパスワードを作成するにはどうすればよいですか?

長さが10〜14文字で、少なくとも1つの大文字、1つの小文字、および1つの特殊文字を含むランダムパスワードを作成する必要があります。残念ながら、いくつかの特殊文字は  特殊で使用できないため、印刷されたASCIIだけを使用することはできません。

このサイトの例の多くは、文字のエントロピーが十分でない、または上記のようなビジネス設定での現実的な要件なしに、ランダムなパスワードまたはセッションキーを生成します。

私のキャラクターセット、スペースを除く標準のUSキーボード上のすべての特殊文字:

A-Z
a-z
0-9
~`!@#$%^&*()-_=+[{]}\|;:'",<.>/?
10
summer

Apache commons RandomStringUtilsを使用することをお勧めします。既に行われていることを使用してください。

String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~`!@#$%^&*()-_=+[{]}\\|;:\'\",<.>/?";
String pwd = RandomStringUtils.random( 15, characters );
System.out.println( pwd );

Mavenを使用している場合

<dependency>
    <groupId>org.Apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.4</version>
</dependency>

それ以外の場合は、jarをダウンロードします

[〜#〜] update [〜#〜]安全なランダムバージョン。そのため、必要な文字が残っており、コメントのように解決でき、必要な部分を個別に生成し、通常の部分を生成できます。その後、ランダムに参加します。

char[] possibleCharacters = (new String("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~`!@#$%^&*()-_=+[{]}\\|;:\'\",<.>/?")).toCharArray();
String randomStr = RandomStringUtils.random( randomStrLength, 0, possibleCharacters.length-1, false, false, possibleCharacters, new SecureRandom() );
System.out.println( randomStr );
30
Robert Wadowski

Vanilla Javaのみを使用し、要件を実装するユーティリティです。基本的に必要な各文字セットの1つを取得します。すべてのアップ。

public class PasswordUtils {

    static char[] SYMBOLS = (new String("^$*.[]{}()?-\"!@#%&/\\,><':;|_~`")).toCharArray();
    static char[] LOWERCASE = (new String("abcdefghijklmnopqrstuvwxyz")).toCharArray();
    static char[] UPPERCASE = (new String("ABCDEFGHIJKLMNOPQRSTUVWXYZ")).toCharArray();
    static char[] NUMBERS = (new String("0123456789")).toCharArray();
    static char[] ALL_CHARS = (new String("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789^$*.[]{}()?-\"!@#%&/\\,><':;|_~`")).toCharArray();
    static Random Rand = new SecureRandom();

    public static String getPassword(int length) {
        assert length >= 4;
        char[] password = new char[length];

        //get the requirements out of the way
        password[0] = LOWERCASE[Rand.nextInt(LOWERCASE.length)];
        password[1] = UPPERCASE[Rand.nextInt(UPPERCASE.length)];
        password[2] = NUMBERS[Rand.nextInt(NUMBERS.length)];
        password[3] = SYMBOLS[Rand.nextInt(SYMBOLS.length)];

        //populate rest of the password with random chars
        for (int i = 4; i < length; i++) {
            password[i] = ALL_CHARS[Rand.nextInt(ALL_CHARS.length)];
        }

        //shuffle it up
        for (int i = 0; i < password.length; i++) {
            int randomPosition = Rand.nextInt(password.length);
            char temp = password[i];
            password[i] = password[randomPosition];
            password[randomPosition] = temp;
        }

        return new String(password);
    }

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            System.out.println(getPassword(8));
        }
    }
}
2
Jose Martinez

Rt.jarのJava.utilパッケージのランダム機能を使用して、任意の長さのランダムパスワードを作成できます。以下は同じためのスニペットです。

public class GeneratePassword {

public static void main(String[] args)
{
        int length = 10;
        String symbol = "-/.^&*_!@%=+>)"; 
        String cap_letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
        String small_letter = "abcdefghijklmnopqrstuvwxyz"; 
        String numbers = "0123456789"; 


        String finalString = cap_letter + small_letter + 
                numbers + symbol; 

        Random random = new Random(); 

        char[] password = new char[length]; 

        for (int i = 0; i < length; i++) 
        { 
            password[i] = 
                    finalString.charAt(random.nextInt(finalString.length())); 

        } 
        System.out.println(password);
}

}

0
Manjunatha B