【问题标题】:help with making a password checker in java帮助在java中制作密码检查器
【发布时间】:2011-02-03 22:20:27
【问题描述】:

我正在尝试用 Java 编写一个程序来检查三个特定的输入。它必须通过这些测试:

  1. 至少7 个字符。
  2. 同时包含upperlower 大小写字母字符。
  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 */)
                {

                }

            }

【问题讨论】:

    标签: java string loops passwords


    【解决方案1】:

    在你的情况下。验证应该有两个条件为真。我认为以下将是实现它的最佳方法。

    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;
    }
    

    【讨论】:

      【解决方案2】:

      正则表达式更适合您要完成的任务。例如,使用lookahead assertions,你会使用这样的东西:

      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.");
      } 
      

      【讨论】:

      • 这是一个为了自己的利益而过于聪明的例子。不仅在表达式中几乎不可读,而且如果它没有通过,它不会告诉你为什么,你需要告诉用户,所以它基本上是没用的。
      • 同意克莱图斯。这是一种可能的方法,它是对问题的有效答案,但它是维护的噩梦。查看该正则表达式并了解导致它通过的原因需要大量的认知开销。
      • 我认为如果一个人理解前瞻运算符,它是完全可读的。至于不告诉用户哪个限制失败,我敢肯定,当您验证电子邮件时,您不会告诉他们它是否是无效域,或者是否缺少点:您只是说用户已输入无效的电子邮件;密码验证也是如此。
      • @JG 呃……不。你会失败。告诉某人输入电子邮件地址,他们就知道该输入什么。告诉某人输入密码,您必须告诉他们为什么密码无效。这就像在说“再试一次”。即使您陈述了所有密码规则,也可能有人没有意识到他们输入的内容不匹配,或者他们可能只是输入了错误的内容。
      • 那么每个人都搞错了,谷歌、雅虎等等,因为他们都规定了规则,然后如果密码不符合要求,他们只会说“再试一次”。但是请继续,我想这些天来对一个典型的家庭作业问题投一个完全有效的答案是可以的。
      【解决方案3】:

      当然,你可以想出一个复杂的——几乎不可读的——正则表达式来做这件事,但我不建议这样做。除了可读性方面,如果密码失败,它不会告诉你原因。这解决了这两个问题:

      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】:
        1. 不要使用 StringTokenizer。使用 String.split。
        2. 使用 Character 类中的函数检查大写、小写或数字。
        3. 由于您已强制小写,因此无法检查。你需要摆脱它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-10-24
          • 2018-03-19
          • 1970-01-01
          • 2016-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-24
          相关资源
          最近更新 更多