Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中有很多限制的随机密码生成_Java_Algorithm_Random_Passwords - Fatal编程技术网

java中有很多限制的随机密码生成

java中有很多限制的随机密码生成,java,algorithm,random,passwords,Java,Algorithm,Random,Passwords,我想创建一个密码生成器,根据用户设置的限制创建密码。这些限制是: 最小密码长度 最大密码长度 最小字母和数字 最小字母 最小大写字母 最小小写字母 最小位数 最大重复字符数 我通过google查找,大多数示例代码都不符合我需要的要求。所以我即兴编写了如下代码: private char[] GeneratePassword(int minLength, int maxLength, int maxRepeatCharacter, int minLetterAndDigit, in

我想创建一个密码生成器,根据用户设置的限制创建密码。这些限制是:

  • 最小密码长度
  • 最大密码长度
  • 最小字母和数字
  • 最小字母
  • 最小大写字母
  • 最小小写字母
  • 最小位数
  • 最大重复字符数
  • 我通过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 = "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
    我面临的问题是如何确保满足最低条件。同时,我不希望通过重复相同类型的字符来生成密码

  • 示例:如果我将最大密码长度设置为10,并且我希望最小数字为5。我更喜欢
    1jP2k3o4m9
    而不是
    57812aJ9tP

  • 第二个示例:如果我将最大密码长度设置为5,并且我希望最小小写字母为3。我更喜欢
    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();
    }