Найти в Дзене
IT код

Генератор паролей на Java ч.2

Всем привет! В предыдущей статье мы написали простой генератор паролей. В этой статье мы его доработаем. Для начала мы не учли одно из важных требований для пароля: пароль должен содержать хотя бы один спецсимвол, одну цифра, одну строчную и одну прописную букву. Создадим строковые переменные, внутри которых будем храним каждый из перечисленных символьных наборов: static String numbers = "1234567890";
static String special = "!@$%^&*";
static String lowercase= "abcdefghijklmnopqrstuvwxyz";
static String uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static String symbols = numbers + special + lowercase + uppercase; И нужно добавить по одному символу от каждого набора в наш генерируемый пароль, для этого напишем небольшой метод public static char randomChar(String symbols){
return symbols.charAt(rnd.nextInt(symbols.length()));
} Здесь с помощью генератора случайных чисел (напомню rnd это SecureRandom()) возвращается 1 случайный символ из набора. И теперь в методе randomPass после объя

Всем привет!

В предыдущей статье мы написали простой генератор паролей. В этой статье мы его доработаем.

Для начала мы не учли одно из важных требований для пароля: пароль должен содержать хотя бы один спецсимвол, одну цифра, одну строчную и одну прописную букву.

Создадим строковые переменные, внутри которых будем храним каждый из перечисленных символьных наборов:

static String numbers = "1234567890";
static String
special = "!@$%^&*";
static String
lowercase= "abcdefghijklmnopqrstuvwxyz";
static String
uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
static String
symbols = numbers + special + lowercase + uppercase;

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

public static char randomChar(String symbols){
return symbols.charAt(
rnd.nextInt(symbols.length()));
}

Здесь с помощью генератора случайных чисел (напомню rnd это SecureRandom()) возвращается 1 случайный символ из набора.

И теперь в методе randomPass после объявления StringBuilder pass = new StringBuilder(len); добавляем к нашему будущему паролю по одному символу из каждого набора символов:

pass.append(randomChar(numbers)).append(randomChar(special)).append(randomChar(lowercase)).append(randomChar(uppercase));

Теперь нам необходимо уменьшить количество итераций в цикле на 4, так как у нас уже есть 4 символа в генерируемом пароле:

for (int i = 0; i < len - 4; i++)

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

Однако мы могли бы передать в наш метод значения и меньшее чем 4, поэтому нам необходимо добавить обработку таких случаев. В данной статье я не буду затрагивать тему проброски исключений, поэтому просто пропишем условие в начале метода, что если будет введен пароль с длиной меньше чем 4, то метод сообщит об ошибке и вернет пустую строку:

if (len < 4){
System.
out.println("Длина пароля меньше 4");
return "";
}

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

public static String shuffle(String str){}

В нем пропишем следующую логику:

- разобьём получаемую строку str на массив символов и сохранbv как структуру данных типа List<String> то есть список строк (хотя в нашем случае строки - это отдельные символы):

List<String> chars = Arrays.asList(str.split(""));

Обратите внимание что метод asList вызывается с помощью класса Arrays из библиотеки java.util

- затем вызываем метод для перемешивания элементов списка с помощью класса Collections:

Collections.shuffle(chars);

- и наконец собираем из списка элементов новую строку:

StringBuilder sb = new StringBuilder(str.length());

for (int i = 0; i < str.length(); i++) sb.append(chars.get(i));

return sb.toString();

Метод-смешиватель готов! :) В методе randomPass возвращаем результат работы метода shuffle:

return shuffle(pass.toString());

Теперь наш генератор паролей работает как надо! Код полностью:

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