Как сгенерировать пароль с обязательным одним специальным символом, одним верхним регистром, одним нижним регистром в JAVA?

Предположим, я беру входной параметр как int и хочу вернуться в String. Как я могу это сделать? Я хочу, чтобы каждый раз после генерации пароля обязательно один специальный символ, один верхний регистр, один нижний регистр. Как я могу это сделать?

Я написал этот код ниже и получил решение, но оно не добавляет каждый раз прописные, строчные и специальные символы в сгенерированный вывод.

public int GeneratePassword(int length) {
    String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstu vwxyz0123456789~`!@#$%^&*()-_=+[{]}\\|;:\'\",<.>/?";

    String pwd = RandomStringUtils.random(length , characters );
    System.out.println("pwd: = "+pwd );

    return 0;
}

Что такое RandomStringUtils?

SamHoque 26.10.2018 17:42

Похоже, вы только что скопировали и вставили ответ от stackoverflow.com/a/31260788/6895166

SamHoque 26.10.2018 17:43

я использую эту библиотеку.

Nikhil Boriwale 26.10.2018 17:46

Либо сохраните текущий код, но убедитесь, что сгенерированная строка соответствует вашим критериям, и повторно сгенерируйте ее до тех пор, пока она не появится, либо случайным образом решите, сколько специальных / верхних / нижних / цифр у вас будет и где они будут в строке, а затем сгенерируйте строку с помощью выбор символов определенных символов

Aaron 26.10.2018 17:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
5
1 127
3

Ответы 3

Хосе Мартинес уже предоставил отличный метод для достижения цели, это фрагмент кода из его метода.

   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);
    }

если вы хотите проверить весь метод, обязательно проверьте его ответ, все заслуги ему.

https://stackoverflow.com/a/51823845/6895166

Вот один из подходов с использованием SecureRandom и StringBuilder

private static String generateRandomString(int length)
{
    StringBuilder sb = new StringBuilder();
    SecureRandom rnd = new SecureRandom();
    String uppercaseChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    String lowercaseChars = "abcdefghijklmnopqrstuvwxyz";
    String specialChars = "0123456789~`!@#$%^&*()-_=+[{]}\\\\|;:\\'\\\",<.>/?";

    boolean nextIsUppercase = false;
    boolean nextIsLowercase = false;
    boolean nextIsSpecial = true;

    for (int i = 0; i < length; i++) {

        if (nextIsSpecial) {
            sb.append(specialChars.charAt(rnd.nextInt(specialChars.length())));
            nextIsUppercase = true;
            nextIsSpecial = false;
            continue;
        }

        if (nextIsUppercase) {
            sb.append(uppercaseChars.charAt(rnd.nextInt(uppercaseChars.length())));
            nextIsUppercase = false;
            nextIsLowercase = true;
            continue;
        }

        if (nextIsLowercase) {
            sb.append(lowercaseChars.charAt(rnd.nextInt(lowercaseChars.length())));
            nextIsLowercase = false;
            nextIsSpecial = true;
            continue;
        }

    }

    return sb.toString();
}

Пример вывода:

System.out.println(generateRandomString(1)); -> 7
System.out.println(generateRandomString(2)); -> :Q
System.out.println(generateRandomString(3)); -> 8St
System.out.println(generateRandomString(4)); -> =Lv%
System.out.println(generateRandomString(16)); ->  %Uf-Hs<Ea|Wp;Rt}

Это решение вашей проблемы:

public static String GeneratePassword(int length) {

    String[] characters = {"0123456789","~!@#$%^&*()-_=+[{]}|;:\'\",<.>/?","ABCDEFGHIJKLMNOPQRSTUVWXYZ","abcdefghijklmnopqrstuvwxyz"};
    Random rand = new Random();
    String password = "";
        for(int i=0;i<length;i++) {
            int random = rand.nextInt(4);//choose a number from 0 to 3(inclusive)
            int string_size = characters[random].length();//get length of the selected string
            int random1 = rand.nextInt(string_size);//choose a number from0 to length-1 of selected string
            char item = characters[random].charAt(random1);//selects the character
            password=password+item;//Concatenates with the password
        }
    return password;
}

К сожалению, это не так. Это выводит, например, wt # или 5'6K, чего не просили.

maio290 26.10.2018 18:13

Как должен выглядеть результат?

Nazareth Keshishian 26.10.2018 18:17

Другие вопросы по теме