7

重複の可能性:
コマンドラインで入力を非表示にする

私はパスワードセキュリティチェッカープログラムを作成していますが、プログラムが正常に実行されるという点で私の質問は奇妙です。私が疑問に思っているのは、コンソールに入力されたテキストをパスワードフィールドのように表示する方法があるかどうかです。つまり、ユーザーがリターンキーを押す前に、入力された単語は「****」と表示されます。

方法があることは承知しJFrameJPasswordFieldいますが、を使用するだけでは役に立たないと思いますScanner

これが私のコードです:

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

1 に答える 1

15

代わりにConsole.readPasswordを使用できます。

readPassword(String fmt, Object... args) 

フォーマットされたプロンプトを提供し、エコーを無効にしてコンソールからパスワードまたはパスフレーズを読み取ります

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();

    }
于 2012-08-22T15:14:17.710 に答える