Программа проверки пароля - проверка заглавных, строчных букв, цифр и специальных символов

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

Пароль должен быть не менее 8 символов, содержать как заглавные, так и строчные буквы, цифру и специальный символ.

Я считаю, что близок к решению этой проблемы, но мои навыки все еще развиваются, и я уперся в стену.

package project1;

/**
 *
 * @author danechristian
 */
import java.util.*;
public class Project1 
{
    static Scanner console = new Scanner(System.in);
    static final String SPECIAL_CHARACTERS = "!,#,$,%,^,&,*,|";
    static String password;

    public static void main(String[] args) 
    {

        System.out.println("Create a password: ");
        password = console.next();

        if (validPassword(password))
        {
            System.out.println("Password Saved");
        }
        else
        {
            System.out.println("Invalid Passowrd. Password "
                    + "must contain atleast 1 capital letter"
                    + "1 lower case letter, 1 digit, 1"
                    + "special character (!#$%^&*|) and "
                    + "be atleast 8 characters long");
        }
    }

public static boolean validPassword(String password)
    {
        boolean upCase = false;
        boolean loCase = false;
        boolean isDigit = false;
        boolean spChar = false;

        if (password.length() >= 8)
           {
            for (int i = 0; i < password.length() - 1; i++)
               {
                if (Character.isUpperCase(password.charAt(i)))
                {
                    upCase = true;
                }

                if (Character.isLowerCase(password.charAt(i)))
                {
                    loCase = true;
                }

                if (Character.isDigit(password.charAt(i)))
                {
                    isDigit = true;
                }

                if (SPECIAL_CHARACTERS.contains(password))
                {
                    spChar = true;
                }
               } 
           }         
        return (upCase && loCase && isDigit && spChar);
    }   

}

person Dane Christian    schedule 27.11.2015    source источник
comment
Какая у вас проблема?   -  person Perdomoff    schedule 28.11.2015
comment
Разве вы не можете просто использовать регулярное выражение для этого?   -  person WIR3D    schedule 28.11.2015
comment
Не знаю, где вы этим упираетесь в стену, потому что для меня все просто и очевидно. Поэтому я не могу видеть вашу проблему. Пожалуйста, объясните, где это.   -  person zapl    schedule 28.11.2015
comment
не оценивает заглавные буквы, строчные буквы, цифры или специальные символы. не знаком с регулярным выражением.   -  person Dane Christian    schedule 28.11.2015
comment
Плохая практика хранить пароль в строке. Следует использовать char[] для начала. Строки являются неизменяемыми, что означает, что пароль будет находиться в оперативной памяти, когда вы закончите с ним работать.   -  person WalterM    schedule 28.11.2015


Ответы (2)


Для проверки есть что-то вроде этого:

public static boolean validPassword(String password){
        boolean upCase = false;
        boolean loCase = false;
        boolean isDigit = false;
        boolean spChar = false;
     if (password.length()>7){
          if (password.matches(".+[A-Z].+")){
              upCase = true;
          }
          if (password.matches(".+[a-z].+")){
              loCase = true;
          }
          if (password.matches(".+[1-9].+")){
              isDigit = true;
          }
          if (SPECIAL_CHARACTERS.contains(password)){
               spChar = true;
          }
     }
  return (upCase && loCase && isDigit && spChar);
} 
person WIR3D    schedule 27.11.2015
comment
но не означает ли это, что напр. цифра не первая или последняя? - person ropo; 01.06.2017
comment
@ropo Жадный символ + представляет 0 или более раз, поэтому он проверяет первый и последний символ. Ссылка на регулярное выражение Java docs.oracle.com/ javase/7/docs/api/java/util/regex/Pattern.html - person WIR3D; 06.06.2017
comment
элегантный ответ. +1 - person Shane Monks O'Byrne; 02.04.2018

решено изменением

если (SPECIAL_CHARACTERS.contains(пароль)){ spChar = true;

в

если (SPECIAL_CHARACTERS.contains(password.substring(i,i+1))){ spChar = true;

это проверяет строку внутри строки.

Кроме того, я удалил «- 1» из своего оператора for, чтобы границы были правильными. также удалил запятые из константы SPECIAL_CHARACTERS.

теперь программа работает без проблем, всем спасибо за советы.

person Dane Christian    schedule 04.12.2015