Проверка пароля - добавление дополнительных требований

1

У меня есть код, который в настоящее время проверяет минимальный и максимальный lentgh. Я хочу также требовать прописные, строчные, специальные char и числовые. Любые предложения о том, что добавить к этому или где я могу найти несколько примеров? Я был Googling и смотрел через этот форум и пытался добавить дополнительные требования к паролю и был неудачным.

Это то, что я хочу требовать.

Длина не менее восьми символов  Длина не более 20 символов  по крайней мере, в нижнем регистре и в одном верхнем регистре  по крайней мере один специальный символ из:! @# $% ^ & *() ~ `- = _ + [] {} |:"; ',./< > ?  хотя бы одно число [0-9]  Не может совпадать с именем входа в систему или адресом электронной почты

Мой текущий код проверки пароля

public static final int MIN_PASSWORD_LENGTH = 8;
public static final int MAX_PASSWORD_LENGTH = 20;

public static boolean isAcceptablePassword(String password)
{
    if(TextUtils.isEmpty(password))
        return false;

    int len = password.length();

    if(len < MIN_PASSWORD_LENGTH || len > MAX_PASSWORD_LENGTH)
        return false;

    for(int i = 0; i < len; i++)
    {
        char c = password.charAt(i);
        if (Character.isWhitespace(c))
            return false;
    }

    return true;
}
  • 3
    Так почему бы просто не реализовать свои требования?
  • 0
    возможный дубликат библиотеки проверки надежности пароля
Показать ещё 4 комментария
Теги:
validation
passwords

3 ответа

4
Лучший ответ

Когда вы анализируете данные String, вы должны удалить пробелы справа и слева. Это выполняется с помощью функции Strimg#trim следующим образом:

password = password.trim();

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

char[] arrPassword = password.toCharArray();

Теперь вы можете оценить char, используя следующие функции: Character#isUpperCase, Character#isLowerCase, Character#isDigit.

И последнее, но не менее важное: у вас может быть строка со специальными символами, которые вам нужно проверить, и проверить, находится ли фактический персонаж внутри этой строки. Это может быть достигнуто с помощью String#indexOf и String#valueOf, это las для преобразования char в тип String.

Вот пример кода для всего этого объяснения:

public static final String SPECIAL_CHARACTERS = "!@#$%^&*()~`-=_+[]{}|:\";',./<>?";
public static final int MIN_PASSWORD_LENGTH = 8;
public static final int MAX_PASSWORD_LENGTH = 20;

public static boolean isAcceptablePassword(String password) {
    if (TextUtils.isEmpty(password)) {
        System.out.println("empty string.");
        return false;
    }
    password = password.trim();
    int len = password.length();
    if(len < MIN_PASSWORD_LENGTH || len > MAX_PASSWORD_LENGTH) {
        System.out.println("wrong size, it must have at least 8 characters and less than 20.");
        return false;
    }
    char[] aC = password.toCharArray();
    for(char c : aC) {
        if (Character.isUpperCase(c)) {
            System.out.println(c + " is uppercase.");
        } else
        if (Character.isLowerCase(c)) {
            System.out.println(c + " is lowercase.");
        } else
        if (Character.isDigit(c)) {
            System.out.println(c + " is digit.");
        } else
        if (SPECIAL_CHARACTERS.indexOf(String.valueOf(c)) >= 0) {
            System.out.println(c + " is valid symbol.");
        } else {
            System.out.println(c + " is an invalid character in the password.");
            return false;
        }
    }
    return true;
}

Предложение System.out.println(c + " is an invalid character in the password."); - это просто проверить результат анализа фактического символа.

  • 0
    что с в пустом состоянии ??
  • 0
    @ArpitPatel исправлено
2

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

Pattern[] checks = {
        Pattern.compile("[!@#\\$%^&*()~`\\-=_+\\[\\]{}|:\\\";',\\./<>?]"),
        Pattern.compile("\\d+"), 
        Pattern.compile("[A-Z]+"),
        Pattern.compile("[a-z]+"), 
        Pattern.compile("^.{8,20}$") };

for (String test : new String[] { "password", "Password1",
        "Password1&", "toolongtoolongtoolong" }) {
    boolean ok = true;
    for (Pattern check : checks) {
        ok = ok && check.matcher(test).find();
    }
    System.out.println(test + " " + ok);
}
0

Стивен прав с небольшим количеством поисков, вы бы легко нашли свои ответы здесь. Но нить, на которую ссылается Стивен, - это использование библиотеки третьей стороны.

Если вы хотите реализовать это самостоятельно, то перед запуском for-loop инициализируйте 4 логических значения для ваших требований с помощью false. При циклическом проверке для всех четырех требований, пока не будет истинно. Установите соответствующее значение boolean в значение true.

Как проверить 4 требования:

  • Длина, которую вы уже выполнили.
  • Символ (yourChar).isLowerCase()
  • Символ (yourChar).isUpperCase()
  • Специальный символ: см. здесь Java String Специальная замена символов - вы можете выбрать аналогичный подход

После цикла проверьте 4 логических элемента и соответственно отреагируйте.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню