Написание генератора паролей - PullRequest
0 голосов
/ 08 июня 2018

Я пытаюсь кодировать генератор паролей на 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);
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Почему именно вам нужно использовать цикл 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);
}
0 голосов
/ 09 июня 2018

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

Медленно:

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

Unsecure:

  • не использовать 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();
}
0 голосов
/ 08 июня 2018

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

Возможность 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...