2012-04-01 9 views
1

私は現在、最小値と最大値をチェックするコードをいくつか持っています。大文字、小文字、特殊文字、および数値も必要とします。これに何を追加するべきか、あるいは私がいくつかの例を見つけることができる場所についての提案はありますか?私はグーグルでこのフォーラムを見ていて、追加のパスワード要求を追加しようとしてきて失敗しました。パスワードの妥当性検査 - 追加の要件の追加

これは私が必要としたいものです。長さ で

少なくとも8文字の長さ これ以上20文字以下に少なくとも小文字と1大文字 少なくとも一つの特殊文字から:!@#$%^ & *()〜 ` - = _ + [] {} |: ";」、/ <> 少なくとも一つの番号[0-9]アカウントのログイン名やメールアドレスが一致しない文字

私の現在のパスワード検証コード

。?
public static final int MIN_PASSWORD_LENGTH = 8; 
public static final int MAX_PASSWORD_LENGTH = 20; 

public static boolean isAcceptablePassword(String password) 
{ 
    if(TextUtils.isEmpty(password)) 
     return false; 

    int len = password.length(); 

    if(len < MIN_PASSWORD_LENGTH || len > MAX_PASSWORD_LENGTH) 
     return false; 

    for(int i = 0; i < len; i++) 
    { 
     char c = password.charAt(i); 
     if (Character.isWhitespace(c)) 
      return false; 
    } 

    return true; 
} 
+3

あなたの要件を実装するだけですか? –

+0

[パスワード強度チェックライブラリ]の複製が可能です(http://stackoverflow.com/questions/3200292/password-strength-checking-library) –

+0

?私がすでに言及したように私は成功せずに試しました。それをどうやって実装するのですか?私はWebデザイナーではなく、Javaプログラマーですが、私は新しい要件のためにいくつかのコードを編集しようとしています。 – rick

答えて

4

データを分析する場合は、左右の空白を消去する必要があります。 、あなたはchar型の配列に変換することができますので、あなたの要件を満たすことが容易になります文字列のすべての文字をanalizeするに

password = password.trim(); 

:これは、このようなStrimg#trim機能によって行われます

char[] arrPassword = password.toCharArray(); 

これらの関数を使ってcharを評価することができます:Character#isUpperCaseCharacter#isLowerCaseCharacter#isDigit

最後に、チェックする必要がある特殊文字を含む文字列を作成し、評価する実際の文字がその文字列内にあるかどうかを確認できます。これは、String#indexOfString#valueOfを使用して達成できました。このlasは、charをString型に変換します。ここで

はすべてこの説明のためのサンプルコードです:

public static final String SPECIAL_CHARACTERS = "[email protected]#$%^&*()~`-=_+[]{}|:\";',./<>?"; 
public static final int MIN_PASSWORD_LENGTH = 8; 
public static final int MAX_PASSWORD_LENGTH = 20; 

public static boolean isAcceptablePassword(String password) { 
    if (TextUtils.isEmpty(password)) { 
     System.out.println("empty string."); 
     return false; 
    } 
    password = password.trim(); 
    int len = password.length(); 
    if(len < MIN_PASSWORD_LENGTH || len > MAX_PASSWORD_LENGTH) { 
     System.out.println("wrong size, it must have at least 8 characters and less than 20."); 
     return false; 
    } 
    char[] aC = password.toCharArray(); 
    for(char c : aC) { 
     if (Character.isUpperCase(c)) { 
      System.out.println(c + " is uppercase."); 
     } else 
     if (Character.isLowerCase(c)) { 
      System.out.println(c + " is lowercase."); 
     } else 
     if (Character.isDigit(c)) { 
      System.out.println(c + " is digit."); 
     } else 
     if (SPECIAL_CHARACTERS.indexOf(String.valueOf(c)) >= 0) { 
      System.out.println(c + " is valid symbol."); 
     } else { 
      System.out.println(c + " is an invalid character in the password."); 
      return false; 
     } 
    } 
    return true; 
} 

System.out.println(c + " is an invalid character in the password.");文だけで実際の文字を分析した結果を確認することです。

+0

何が空の状態ですか? –

+0

@ArpitPatelが修正されました –

0

スティーブンは、ちょっとした検索で、あなたの答えが簡単にここで見つかるはずです。しかし、Stephenスレッドが指し示すスレッドはthirdpartyライブラリを使用しています。

これを自分で実装したい場合は、forループを開始する前に、要件の4つのブール値をfalseで初期化します。ループする間に、4つの要件すべてが真であるまでチェックされます。対応するブール値をtrueに設定します。

  • あなたはすでに実装長REQ:4つの要件を確認する方法

  • キャラクタ(yourChar).isLowerCase()
  • キャラクタ(yourChar)。isUpperCase()
  • 特殊文字:ここを参照してください:Java String Special character replacementを - あなたは4つのブールのためのループチェックした後

同様のアプローチを選択し、それに応じて反応することができます。

2

良い古い正規表現はどうですか?これは正しく動作するようですが、特別なチェックのためにエスケープするときにスリップしたかもしれませんが、

Pattern[] checks = { 
     Pattern.compile("[[email protected]#\\$%^&*()~`\\-=_+\\[\\]{}|:\\\";',\\./<>?]"), 
     Pattern.compile("\\d+"), 
     Pattern.compile("[A-Z]+"), 
     Pattern.compile("[a-z]+"), 
     Pattern.compile("^.{8,20}$") }; 

for (String test : new String[] { "password", "Password1", 
     "Password1&", "toolongtoolongtoolong" }) { 
    boolean ok = true; 
    for (Pattern check : checks) { 
     ok = ok && check.matcher(test).find(); 
    } 
    System.out.println(test + " " + ok); 
} 
関連する問題