8

Possible Duplicate:
Hide input on command line

I'm making a password security checker program and my question is odd in that my program runs just fine. What I'm wondering is whether there is any way of making text entered to the console appear as it would in a password field. i.e the word entered will appear as "****" BEFORE the user presses the return key.

I am aware that JFrame has a JPasswordField method but I don't think that helps me when in just using Scanner.

Here is my code:

import java.util.Scanner;

public class SecurityCheckerMain {

    static String enteredPassword;

    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        System.out.println("Please enter your password: ");
        enteredPassword = input.nextLine();
        Checker tc = new Checker(enteredPassword);
        tc.checkSecurity();

    }

}

public class Checker {

    //number of chars : the Higher the Better("password must be greater than 8 chars"){done}
    //combination of uppercase and lowercase{done}
    //contains numbers{done}
    //non repeated characters (every char is different ascii char){done}
    //is not a consecutive password ie 123456789 or 987654321{done}
    //is not blank ("[space]"){done} 


    int pLength;
    final int MAX_STRENGTH = 10;
    int pStrength = 0;
    String pass;

    public Checker(String pwd){
        pass = pwd;
        pLength = pwd.length();

    }

    public void checkSecurity(){
        if(pass.isEmpty()){
            System.out.println("Password Field is Empty! Password is Very Insecure.");
        }
        if(pLength >= 8){
            pStrength++;
            if(pLength >= 12){
                pStrength++;
                if(pLength >= 16){
                    pStrength++;
                }
            }
        }
        if(hasUpperCase(pass) && hasLowerCase(pass)){
            pStrength+=2;
        }
        if(containsNumbers(pass)){
            pStrength+=2;
        }
        if(hasNoRepeats(pass)){
            pStrength+=2;
        }
        if(!containsConsecutiveNums(pass)){
            pStrength++;
        }

        System.out.println("Your password strength is rated at " + pStrength +"/" + MAX_STRENGTH);

    }


    //Component Methods

    public boolean hasUpperCase(String str){
        for(int i = 0; i<pLength; i++){
            if(Character.isUpperCase(str.charAt(i))){
                return true;
            }
        }
        return false;

    }

    public boolean hasLowerCase(String str){
        for(int i  = 0; i<pLength; i++){
            if(Character.isUpperCase(str.charAt(i))){
                return true;
            }
        }
        return false;
    }

    public boolean containsNumbers(String str){
        for(int i = 0; i<pLength; i++){
            if(Character.isDigit(str.charAt(i))){
                return true;
            }
        }
        return false;
    }

    public boolean hasNoRepeats(String str){
        for(int i = 0; i<pLength; i++)
            if(containsChar(str, str.charAt(i))){
                return false;
            }
        return true;
    }


    public boolean containsChar(String s, char search) {
        if (s.length() == 0)
            return false;
        else
            return s.charAt(0) == search || containsChar(s.substring(1), search);
    }

    public boolean containsConsecutiveNums(String str){
        for(int i = 0; i<pLength; i++){
            if(Character.isDigit(str.charAt(i))){
                if(str.charAt(i)-1 == str.charAt(i-1) || str.charAt(i)+1 == str.charAt(i+1)){
                    return true;
                }
            }
        }
        return false;
    }
}
Community
  • 1
  • 1
Simon Hillary
  • 213
  • 1
  • 4
  • 12
  • http://www.javapractices.com/topic/TopicAction.do?Id=79 – jdevelop Aug 22 '12 at 15:12
  • You can't read character by character in Java, only line by line. What you can do is change the colour of the text to black on a black background. – Peter Lawrey Aug 22 '12 at 15:15
  • 1
    Here is an example, please take a look at http://stackoverflow.com/questions/10819469/hide-input-on-command-line – axcdnt Aug 22 '12 at 15:16

1 Answers1

15

You can use Console.readPassword instead.

readPassword(String fmt, Object... args) 

Provides a formatted prompt, then reads a password or passphrase from the console with echoing disabled

public class SecurityCheckerMain {

    static String enteredPassword;

    public static void main(String[] args) {

        Console console = System.console();

        enteredPassword =
            new String(console.readPassword("Please enter your password: "));
        Checker tc = new Checker(enteredPassword);
        tc.checkSecurity();

    }
munyengm
  • 15,029
  • 4
  • 24
  • 34