помогите с созданием проверки пароля в Java - PullRequest
5 голосов
/ 03 апреля 2010

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

  1. Не менее 7 символов.
  2. Содержит буквенные символы upper и lower.
  3. Содержит не менее 1 цифры.

Пока мне удалось проверить, есть ли 7 символов, но у меня проблемы с последними двумя. Что я должен поместить в свой цикл в качестве оператора if, чтобы проверить наличие цифр и сделать его прописными и строчными. Любая помощь будет принята с благодарностью. Вот что у меня есть.

import java.awt.*;
import java.io.*;
import java.util.StringTokenizer;

public class passCheck
{


    private static String getStrSys ()
    {
        String myInput = null;          //Store the String that is read in from the command line

        BufferedReader mySystem;        //Buffer to store the input

        mySystem = new BufferedReader (new InputStreamReader (System.in)); //creates a connection to system input
        try
        {
            myInput = mySystem.readLine (); //reads in data from the console
            myInput = myInput.trim ();
        }
        catch (IOException e)  //check
        {
            System.out.println ("IOException: " + e);
            return "";
        }
        return myInput; //return the integer to the main program
    }


    //****************************************
    //main instructions go here
    //****************************************

    static public void main (String[] args)
    {

        String pass;         //the words the user inputs
        String temp = "";            //holds temp info

        int stringLength;          //length of string
        boolean goodPass = false;


        System.out.print ("Please enter a password: ");  //ask for words

        pass = getStrSys ();                              //get words from system
        temp = pass.toLowerCase ();
        stringLength = pass.length ();             //find length of eveyrthing



        while (goodPass == false)

            {
                if (stringLength < 7)
                {
                    System.out.println ("Your password must consist of at least 7 characters");
                    System.out.print ("Please enter a password: ");  //ask for words
                    pass = getStrSys ();
                    stringLength = pass.length ();
                    goodPass = false;
                }
                else if (/* something to check for digits */)
                {

                }

            }

Ответы [ 4 ]

7 голосов
/ 03 апреля 2010

Конечно, вы можете придумать запутанное & mdash; почти нечитаемое - регулярное выражение для этого, но я бы не советовал. Помимо аспекта читабельности, если пароль не удается, он не говорит вам, почему. Это решает обе эти проблемы:

while (true) {
  pass = getStrSys();
  if (pass.length() < 7) {
    System.out.println("must be at least 7 characters long");
  } else {
    boolean upper = false;
    boolean lower = false;
    boolean number = false;
    for (char c : pass.toCharArray()) {
      if (Character.isUpperCase(c)) {
        upper = true;
      } else if (Character.isLowerCase(c)) {
        lower = true;
      } else if (Character.isDigit(c)) {
        number = true;
      }
    }
    if (!upper) {
      System.out.println("must contain at least one uppercase character");
    } else if (!lower) {
      System.out.println("must contain at least one lowercase character");
    } else if (!number) {
      System.out.println("must contain at least one number");
    } else {
      break;
    }
  }
}
4 голосов
/ 03 апреля 2010

Регулярное выражение больше подходит для того, что вы пытаетесь выполнить. Например, используя прогнозные утверждения , вы будете использовать что-то вроде этого:

Pattern p = Pattern.compile("^.*(?=.{7,})(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9]).*$");
String pass = getStrSys();
Matcher m = p.matcher(pass);
if (m.matches()) {
  System.out.println("Valid password.");
} else {
  System.out.println("Invalid password.");
} 
1 голос
/ 26 апреля 2013

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

private static final char[] SPECIAL = "$!+\-#?_%&/".toCharArray();
private static final char[] NUMBER = "0123456789".toCharArray();


public static boolean checkValidation(String password)
{
    int points = 0;
    String lowerPass = password.toLowerCase();
    String upperPass = password.toUpperCase();
    if(!password.equals(lowerPass) && !password.equals(upperPass))
    {
        // if contains upper or lower letter
        points++;
    }

    if(contains(password, SPECIAL))
    {
        // if it contains special character
        points++;
    }
    if(contains(password, NUMBER))
    {
        // if it contains Number
        points++;
    }

    return points >= 2;
}


public static boolean contains(String pwd, char[] value)
{
    int i = 0;
    boolean success = false;
    while(i < value.length && !success)
    {
        if(pwd.indexOf(""+value[i]) != -1)
        {
            success = true;
        }
        i++;
    }
    return success;
}
1 голос
/ 03 апреля 2010
  1. Не используйте StringTokenizer. Использовать String.split.
  2. Используйте функции класса Character для проверки прописных, строчных или числовых значений.
  3. Поскольку вы указали нижний регистр, вы не можете проверить. Вы должны избавиться от этого.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...