Javaでシステムの長さと文字セットの要件を満たすランダムパスワードを作成するにはどうすればよいですか?
長さが10〜14文字で、少なくとも1つの大文字、1つの小文字、および1つの特殊文字を含むランダムパスワードを作成する必要があります。残念ながら、いくつかの特殊文字は も 特殊で使用できないため、印刷されたASCIIだけを使用することはできません。
このサイトの例の多くは、文字のエントロピーが十分でない、または上記のようなビジネス設定での現実的な要件なしに、ランダムなパスワードまたはセッションキーを生成します。
私のキャラクターセット、スペースを除く標準のUSキーボード上のすべての特殊文字:
A-Z
a-z
0-9
~`!@#$%^&*()-_=+[{]}\|;:'",<.>/?
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 );
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));
}
}
}
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);
}
}