Я хотел бы создать генератор паролей, создающих пароль в соответствии с установленным пользователем ограничением. Ограничения есть:генерация случайного пароля с ограничением в java
- Минимальная длина пароля
- Максимальная длина пароля
- Минимальное письмо И Digit
- Минимальное письмо
- Минимальное Прописные письмо
- Минимальное строчных букв
- Минимальная Digit
- Максимальный повторяющийся символ
Я смотрю через Google, и большинство примеров кода не соответствует требуемому требованию. Так что я импровизировать код вроде этого:
private char[] GeneratePassword(int minLength, int maxLength,
int maxRepeatCharacter, int minLetterAndDigit, int minLetter,
int minLowerCaseLetter, int minUpperCaseLetter, int minDigit) {
final String LETTER = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
final String UPPERCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
final String LOWERCASE = "abcdefghijklmnopqrstuvwxyz";
final String DIGIT = "";
final String[] randomSelector = {LETTER,UPPERCASE,LOWERCASE,DIGIT};
int len = getRandomNumber(minLength, maxLength);
char[] passwordGenerated = new char[len];
char[] characterUsed = new char[len];
int selection;
int letterAndDigitUsed = 0;
int letterUsed = 0;
int lowerCaseLetterUsed = 0;
int upperCaseLetterUsed = 0;
int digitUsed = 0;
int index = 0;
if (minLength > maxLength) {
// throw new IllegalArgumentException("Min.Length > Max.Length!");
}
if (minLetter + minDigit > minLetterAndDigit) {
// throw new IllegalArgumentException("Error!");
}
while (index != len) {
selection = getRandomNumber(0, randomSelector.length);
if (selection == 0) {
passwordGenerated[index] = LETTER.charAt(RandomUtils.nextInt(0,
LETTER.length()));
if (checkRepeatCharacter(passwordGenerated[index],
characterUsed, index, maxRepeatCharacter) == false) {
characterUsed[index] = passwordGenerated[index];
index++;
letterUsed++;
letterAndDigitUsed++;
break;
}
} else if (selection == 1) {
passwordGenerated[index] = UPPERCASE.charAt(RandomUtils
.nextInt(0, UPPERCASE.length()));
if (checkRepeatCharacter(passwordGenerated[index],
characterUsed, index, maxRepeatCharacter) == false) {
characterUsed[index] = passwordGenerated[index];
index++;
upperCaseLetterUsed++;
letterAndDigitUsed++;
break;
}
} else if (selection == 2) {
passwordGenerated[index] = LOWERCASE.charAt(RandomUtils
.nextInt(0, LOWERCASE.length()));
if (checkRepeatCharacter(passwordGenerated[index],
characterUsed, index, maxRepeatCharacter) == false) {
characterUsed[index] = passwordGenerated[index];
index++;
lowerCaseLetterUsed++;
letterAndDigitUsed++;
break;
}
} else if (selection == 3) {
passwordGenerated[index] = DIGIT.charAt(RandomUtils.nextInt(0,
DIGIT.length()));
if (checkRepeatCharacter(passwordGenerated[index],
characterUsed, index, maxRepeatCharacter) == false) {
characterUsed[index] = passwordGenerated[index];
index++;
digitUsed++;
letterAndDigitUsed++;
break;
}
}
}
return passwordGenerated;
}
private boolean checkRepeatCharacter(char passwordGenerated,
char[] passwordUsed, int index, int maxRepeatCharacter) {
int characterRepeated = 0;
for (int i = 0; i < index; i++) {
if (String.valueOf(passwordUsed[i]).equals(
String.valueOf(passwordGenerated))) {
characterRepeated++;
if (characterRepeated == maxRepeatCharacter) {
return true;
}
}
}
return false;
}
private int getRandomNumber(int minLength, int maxLength) {
Random r = new Random();
return r.nextInt(maxLength - minLength) + minLength;
}
Проблемы, что у меня есть, как обеспечить минимальное условие выполнено. В то же время я не хочу, чтобы мой пароль был сгенерирован, повторяя один и тот же тип символа.
Пример: Если я кладу максимальную длину пароля до 10, и я хочу минимальную цифру 5. Я предпочитаю иметь
1jP2k3o4m9
, а не57812aJ9tP
.2-й пример: если я надену максимальную длину пароля на 5, и мне нужна минимальная строчная буква 3. Я предпочитаю иметь
Pj9mn
, а неjkl5V
.
Как вы можете видеть, второй сгенерированный пароль сначала пытается заполнить минимальное требование, а затем сделать случайный выбор только для другого символьного типа. Это сделает пароль более уязвимым. Есть ли способ сделать этот алгоритм.
Ref: Generating a Random Password with Restrictions in Java
'3' ** не является ** строчной буквы. –
@ElliottFrisch, на какую часть вы имеете в виду? –
* Я установил максимальную длину пароля на 5 и хочу минимальную строчную букву 3 * –