java中有很多限制的随机密码生成
我想创建一个密码生成器,根据用户设置的限制创建密码。这些限制是:java中有很多限制的随机密码生成,java,algorithm,random,passwords,Java,Algorithm,Random,Passwords,我想创建一个密码生成器,根据用户设置的限制创建密码。这些限制是: 最小密码长度 最大密码长度 最小字母和数字 最小字母 最小大写字母 最小小写字母 最小位数 最大重复字符数 我通过google查找,大多数示例代码都不符合我需要的要求。所以我即兴编写了如下代码: private char[] GeneratePassword(int minLength, int maxLength, int maxRepeatCharacter, int minLetterAndDigit, in
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 = "0123456789";
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;
}
private char[]GeneratePassword(int-minLength,int-maxLength,
int maxRepeatCharacter,int minLetter和Digital,int minLetter,
int min小写字母、int min大写字母、int minDigit){
最后一个字符串字母=“abcdefghijklmnopqrstuvxyzabdfghijklmnopqrstuvxyz”;
最后一个字符串大写=“abcdefghijklmnopqrstuvxyz”;
最后一个字符串小写=“abcdefghijklmnopqrstuvwxyz”;
最后一个字符串数字=“0123456789”;
最后一个字符串[]随机选择器={字母,大写,小写,数字};
int len=getRandomNumber(minLength,maxLength);
char[]passwordGenerated=新字符[len];
char[]characterUsed=新字符[len];
int选择;
int-letterAndDigitUsed=0;
int-letterUsed=0;
int lowerCaseLetterUsed=0;
int upperCaseLetterUsed=0;
int数字化=0;
int指数=0;
如果(最小长度>最大长度){
//抛出新的IllegalArgumentException(“最小长度>最大长度!”);
}
如果(minLetter+minDigit>minLetterAndDigit){
//抛出新的IllegalArgumentException(“错误!”);
}
while(索引!=len){
选择=getRandomNumber(0,randomSelector.length);
如果(选择==0){
passwordGenerated[index]=LETTER.charAt(RandomUtils.nextInt(0,
字母长度();
if(checkRepeatCharacter)(密码生成[索引],
characterUsed,index,maxRepeatCharacter)==false){
characterUsed[索引]=生成的密码[索引];
索引++;
字母使用++;
字母和数字++;
打破
}
}else if(选择==1){
passwordGenerated[index]=大写.charAt(随机数)
.nextInt(0,大写.length());
if(checkRepeatCharacter)(密码生成[索引],
characterUsed,index,maxRepeatCharacter)==false){
characterUsed[索引]=生成的密码[索引];
索引++;
大写字母使用++;
字母和数字++;
打破
}
}else if(选择==2){
passwordGenerated[index]=小写.charAt(RandomUtils)
.nextInt(0,小写.length());
if(checkRepeatCharacter)(密码生成[索引],
characterUsed,index,maxRepeatCharacter)==false){
characterUsed[索引]=生成的密码[索引];
索引++;
小写字母eletterUsed++;
字母和数字++;
打破
}
}else if(选择==3){
passwordGenerated[index]=DIGIT.charAt(RandomUtils.nextInt(0,
数字长度());
if(checkRepeatCharacter)(密码生成[索引],
characterUsed,index,maxRepeatCharacter)==false){
characterUsed[索引]=生成的密码[索引];
索引++;
数字化++;
字母和数字++;
打破
}
}
}
返回生成的密码;
}
私有布尔checkRepeatCharacter(生成的字符密码,
char[]密码已使用,int索引,int maxRepeatCharacter){
int characterRepeated=0;
对于(int i=0;i
我面临的问题是如何确保满足最低条件。同时,我不希望通过重复相同类型的字符来生成密码
1jP2k3o4m9
而不是57812aJ9tP
Pj9mn
而不是jkl5V
参考:我想看看vt密码: 除了基于一些相当标准的必需特征提供灵活的密码验证机制外,它还支持生成满足“字符规则”列表定义的条件的密码: 值得注意的是,该项目已经从孵化阶段毕业,现在被称为Passay-
当前密码不反映vt password可用的同一组字符规则。您可以使用vt密码运行一段时间,也可以提供自己的
CharacterRule
实现来使用Passay生成器(+验证器,如果需要的话)。我想看看类似vt密码的东西:
除了提供灵活的机械装置
private boolean checkRepeatCharacter(char randomCharacter,
ArrayList<Character> passwordUsed, int usedLength,
int maxRepeatCharacter) {
int characterRepeated = 0;
for (int i = 0; i < usedLength; i++) {
if (String.valueOf(passwordUsed.get(i)).equals(
String.valueOf(randomCharacter))) {
characterRepeated++;
if (characterRepeated == maxRepeatCharacter) {
return false;
}
}
}
return true;
}
private boolean checkUsedIndex(int index, ArrayList<Integer> usedIndex) {
for (int i = 0; i < usedIndex.size(); i++) {
if (usedIndex.contains(index)) {
return false;
}
}
return true;
}
private int getRandomNumber(int minLength, int maxLength) {
Random r = new Random();
return r.nextInt(maxLength - minLength) + minLength;
}
public String generatePassword(int minLength, int maxLength,
int maxRepeatCharacter, int minLetterAndDigit, int minLetter,
int minLowerCaseLetter, int minUpperCaseLetter, int minDigit,
int minSpecialCharacter, String specialCharacter) {
final String LOWERCASE = "abcdefghijklmnopqrstuvwxyz";
final String UPPERCASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
final String DIGIT = "0123456789";
StringBuilder ALL = new StringBuilder();
ALL.append(LOWERCASE);
ALL.append(UPPERCASE);
ALL.append(DIGIT);
ALL.append(specialCharacter);
ALL.toString();
char getRandom;
int length = 0;
StringBuilder passwordGenerated = new StringBuilder();
ArrayList<Character> characterUsed = new ArrayList<Character>();
ArrayList<Integer> indexUsed = new ArrayList<Integer>();
int passwordLength = 0;
int lowerCaseLetterUsed = 0;
int upperCaseLetterUsed = 0;
int letterUsed = 0;
int digitUsed = 0;
int letterAndDigitUsed = 0;
int specialCharacterUsed = 0;
if (minLength > maxLength) {
throw new IllegalArgumentException("Min. Length > Max. Length!");
}
if (minUpperCaseLetter + minLowerCaseLetter > minLetter) {
throw new RuntimeException(
"mininimum Lower Case + Minimum Uppercase cannot exceed minLetter");
}
if (minLetter + minDigit > minLetterAndDigit) {
throw new RuntimeException(
"mininimum Letter + Minimum Digit cannot exceed minimum Letter And Digit");
}
if (minLetter + minDigit + minSpecialCharacter > maxLength) {
throw new RuntimeException(
"minimum Digit + minimum Letter + Minimum Special Character cannot excced maximum Length");
}
while ((length < minLetter) && (length < minLetterAndDigit)) {
length = getRandomNumber(minLength, maxLength);
}
while (passwordLength != length) {
while (letterAndDigitUsed < minLetterAndDigit) {
while (letterUsed < minLetter) {
lowerCaseLetterUsed = 0;
for (int i = 0; lowerCaseLetterUsed < minLowerCaseLetter; i++) {
int index = getRandomNumber(0, length);
if (checkUsedIndex(index, indexUsed) == true) {
getRandom = LOWERCASE.charAt(getRandomNumber(0,
LOWERCASE.length()));
if (checkRepeatCharacter(getRandom, characterUsed,
characterUsed.size(), maxRepeatCharacter) == true) {
passwordGenerated.append(getRandom);
characterUsed.add(getRandom);
indexUsed.add(index);
lowerCaseLetterUsed++;
letterUsed++;
letterAndDigitUsed++;
passwordLength++;
if (letterUsed == minLetter) {
break;
}
}
}
}
if (letterAndDigitUsed == minLetterAndDigit) {
break;
}
upperCaseLetterUsed = 0;
for (int i = 0; upperCaseLetterUsed < minUpperCaseLetter; i++) {
int index = getRandomNumber(0, length);
if (checkUsedIndex(index, indexUsed) == true) {
getRandom = UPPERCASE.charAt(getRandomNumber(0,
UPPERCASE.length()));
if (checkRepeatCharacter(getRandom, characterUsed,
characterUsed.size(), maxRepeatCharacter) == true) {
passwordGenerated.append(getRandom);
characterUsed.add(getRandom);
indexUsed.add(index);
lowerCaseLetterUsed++;
letterUsed++;
letterAndDigitUsed++;
passwordLength++;
if (letterUsed == minLetter) {
break;
}
}
}
}
if (letterAndDigitUsed == minLetterAndDigit) {
break;
}
}
for (int i = 0; digitUsed < minDigit; i++) {
int index = getRandomNumber(0, length);
if (checkUsedIndex(index, indexUsed) == true) {
getRandom = DIGIT.charAt(getRandomNumber(0,
DIGIT.length()));
if (checkRepeatCharacter(getRandom, characterUsed,
characterUsed.size(), maxRepeatCharacter) == true) {
passwordGenerated.append(getRandom);
characterUsed.add(getRandom);
indexUsed.add(index);
digitUsed++;
letterAndDigitUsed++;
passwordLength++;
}
}
}
}
for (int i = 0; specialCharacterUsed < minSpecialCharacter; i++) {
if (checkUsedIndex(i, indexUsed) == true) {
getRandom = specialCharacter.charAt(getRandomNumber(0,
specialCharacter.length()));
if (checkRepeatCharacter(getRandom, characterUsed,
characterUsed.size(), maxRepeatCharacter) == true) {
passwordGenerated.append(getRandom);
characterUsed.add(getRandom);
indexUsed.add(i);
specialCharacterUsed++;
passwordLength++;
}
}
}
for (int i = 0; i < length; i++) {
if (checkUsedIndex(i, indexUsed) == true) {
getRandom = ALL.charAt(getRandomNumber(0, ALL.length()));
if (checkRepeatCharacter(getRandom, characterUsed,
characterUsed.size(), maxRepeatCharacter) == true) {
passwordGenerated.append(getRandom);
characterUsed.add(getRandom);
indexUsed.add(i);
passwordLength++;
}
}
}
}
return passwordGenerated.toString();
}