Java - Написание генератора паролей

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

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

Как я могу сделать это простым и понятным способом?

Попытка 1:

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
/**
 * Write a description of class PasswordGenerator here.
 *
 * @author C.G.Stewart
 * @version 06/06/18
 */
public class PasswordGenerator
{
    private String input;
    private int i;
    private String newPass;
    /**
     * Constructor for objects of class Password
     */
    public PasswordGenerator()
    {
        // initialise instance variables
        input = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

        ArrayList<String> Password = new ArrayList<String>();
        Scanner pass = new Scanner(System.in);
    }

    /**
     * This method generates a random alphanumeric string to be used as the new 
     * password
     */
    public void generatePassword()
    {
        Random rnd = new Random();
        for(i=1; i<=20; i++)
        {
            Math.random();
            System.out.println(input.charAt(i));
        }
        //newPass = System.out.println(input.charAt(i));
    }

    /**
     * This method takes the previously generated random alphanumeric string,
     * and outputs it to the screen. 
     */
    public void newPassword()
    {
        System.out.println(newPass);
    }
}

Попытка 2:

import java.util.Scanner;
import java.util.Random;
/**
 * Write a description of class Password here.
 *
 * @author (your name)
 * @version (a version number or a date)
 */
public class Password
{
    // instance variables - replace the example below with your own
    private String index;

    /**
     * Constructor for objects of class Password
     */
    public Password()
    {
        // initialise instance variables
        index = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        Scanner pass = new Scanner(System.in);
    }

    //Returns a random alphanumeric string of an inputted length
    public void printPassword()
    {
        for(int i=10; i<=20; i++)
        {
            while(i<=20)
            {
                Random rand = new Random();
                char letter;

                letter = index.charAt(i);
            }
            System.out.println(i);
        }
    }
}
Random.ints.
Boris the Spider 08.06.2018 22:28

Возможный дубликат: Генератор паролей Java

amdelamar 08.06.2018 22:29

Добро пожаловать в Stack Overflow. Это не сервис написания кода / SQL / регулярных выражений, где вы публикуете список своих требований и языка по выбору, а кодовая обезьяна выдает код за вас. Мы более чем рады помочь, но ожидаем, что вы в первую очередь постараетесь решить проблему самостоятельно. Как только вы это сделаете, вы можете объяснить возникшую у вас проблему, включить в свою работу части уместным и задать конкретный вопрос, и мы постараемся помочь. Удачи.

Ken White 08.06.2018 22:43

@KenWhite Я попытался решить эту проблему, но единственный вывод, который я получаю, вовсе не случайный и не тот, который мне нужен удаленно. Единственный код, который у меня есть, - это код, который сильно поврежден, и поэтому он не имеет отношения к делу. Поэтому я спросил, была ли у кого-нибудь эта проблема раньше и как они к ней подошли.

user83024 08.06.2018 22:50

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

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

Ответы 3

Есть несколько способов сделать это, вот некоторые из них:

Возможность 1:

public class PasswordGenerator {

       private static SecureRandom random = new SecureRandom();

        /** different dictionaries used */
        private static final String ALPHA_CAPS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        private static final String ALPHA = "abcdefghijklmnopqrstuvwxyz";
        private static final String NUMERIC = "0123456789";
        private static final String SPECIAL_CHARS = "!@#$%^&*_=+-/";

        /**
         * Method will generate random string based on the parameters
         * 
         * @param len
         *            the length of the random string
         * @param dic
         *            the dictionary used to generate the password
         * @return the random password
         */
        public static String generatePassword(int len, String dic) {
        String result = "";
        for (int i = 0; i < len; i++) {
            int index = random.nextInt(dic.length());
            result += dic.charAt(index);
        }
        return result;
        }

Взято из: Как сгенерировать случайный пароль на Java

Возможность 2:Random.ints

Возможность 3:

public final class RandomStringGenerator extends Object


 // Generates a 20 code point string, using only the letters a-z
 RandomStringGenerator generator = new RandomStringGenerator.Builder()
     .withinRange('a', 'z').build();
 String randomLetters = generator.generate(20);

 // Using Apache Commons RNG for randomness
 UniformRandomProvider rng = RandomSource.create(...);
 // Generates a 20 code point string, using only the letters a-z
 RandomStringGenerator generator = new RandomStringGenerator.Builder()
     .withinRange('a', 'z')
     .usingRandom(rng::nextInt) // uses Java 8 syntax
     .build();
 String randomLetters = generator.generate(20);

Взято из: Класс RandomStringGenerator

@KenWhite спасибо за информацию, добавил код по ссылкам!

IceLady 08.06.2018 22:45

Почему вам нужно использовать цикл for для поиска по строке, если вы просто хотите получить случайный символ из строки?

почему бы вам просто не сгенерировать случайное целое число и использовать его как индекс строки?

что-то вроде этого:

String str, password = ""; 

for (int i=0; i<passwordLength; i++){
    Random rand = new Random();
    int index = rand.nextInt(str.length());
    password += str.charAt(index);
}

Некоторые подсказки к другим ответам:

Медленный:

  • не используйте string += "something" в цикле, используйте StringBuilder

Небезопасный:

  • не используйте Random, используйте SecureRandom

Код:

private static final String ALPHA_CAPS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String ALPHA = "abcdefghijklmnopqrstuvwxyz";
private static final String NUMERIC = "0123456789";
private static final String SPECIAL_CHARS = "!@#$%^&*_=+-/";

private static final SecureRandom random = new SecureRandom();
private static final char[] dic = (ALPHA_CAPS + ALPHA + NUMERIC + SPECIAL_CHARS).toCharArray();

public static String generatePassword(int len) { 

    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < len; i++) {
        sb.append(dic[random.nextInt(dic.length)]);
    }
    return sb.toString();
}

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