24

重複の可能性:
強力なパスワード正規表現
パスワード強度のために正規表現が必要ですか?

文字列で特定の基準(具体的にはパスワード強度)を検索するための最良の方法は何ができるのだろうかと思っていました。

これまでのところ、私は簡単です:

if(password.Length <= 7)
    {
        errorMessage = "Your password must be at least 8 characters.";
    }

大文字を確認したいのですが、方法や手順がわかりません。グーグルを試し、Webサイト http://msdn.microsoft.comを検索し、C#ブック(C#Programming 3E、Barbara Doyleによる)のインデックスを検索しましたが、何も見つからないようです。

私はこれを試すことができることを知っています...:

foreach(char c in password)
    {
        if(c!='A' || c!='B' || c!='C' || c!='D' ..... || c!='Z')
        {
            errorMessage = "Your password must contain at least one capital letter";
        }
    }

...しかし、それは非常にずさんで、少なくとも1つの小文字をチェックするために2倍にする必要があります。これを行うためのより良い方法、または少なくとも上記で示した方法の省略形があると確信しています。

また、特殊文字のパスワードを確認することもできます(上記の例では、大文字と小文字よりも簡単に実行できるようです。必要に応じて、特殊文字に使用することもできます)。それを行う簡単な(または適切な)方法があれば、私もその知識を持っていたいです。

とにかく、誰もが与えることができるどんな助けにも本当にありがとう。

4

1 に答える 1

76

ここから盗んだのでクレジットが取れません

using System.Text;
using System.Text.RegularExpressions;

  public enum PasswordScore
  {
    Blank = 0,
    VeryWeak = 1,
    Weak = 2,
    Medium = 3,
    Strong = 4,
    VeryStrong = 5
  }

  public class PasswordAdvisor
  {
    public static PasswordScore CheckStrength(string password)
    {
      int score = 0;

      if (password.Length < 1)
        return PasswordScore.Blank;
      if (password.Length < 4)
        return PasswordScore.VeryWeak;

      if (password.Length >= 8)
        score++;
      if (password.Length >= 12)
        score++;
      if (Regex.Match(password, @"/\d+/", RegexOptions.ECMAScript).Success)
        score++;
      if (Regex.Match(password, @"/[a-z]/", RegexOptions.ECMAScript).Success &&
        Regex.Match(password, @"/[A-Z]/", RegexOptions.ECMAScript).Success)
        score++;
      if (Regex.Match(password, @"/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/", RegexOptions.ECMAScript).Success)
        score++;

      return (PasswordScore)score;
    }
  }

大文字をチェックするために正規表現を使用していることに注意してください。これは、長さ、大文字と小文字、数字、特殊文字の使用をチェックするため、適切なアプローチのようです。

** アップデート **

質問が終了したことはわかっていますが、VoidKingの説明を追加して、いくつかの概念を理解することができます。

PasswordScoreはCheckStrengthメソッドから返されます。これは、コードで次に行うことの条件として使用できます。

上記のコードを使用する方法のテストされていないデモを次に示します。

String password = "MyDummy_Password"; // Substitute with the user input string
PasswordScore passwordStrengthScore = PasswordAdvisor.CheckStrength(password);

switch (passwordStrengthScore) {
    case PasswordScore.Blank:
    case PasswordScore.VeryWeak:
    case PasswordScore.Weak:
            // Show an error message to the user
            break;
    case PasswordScore.Medium:
    case PasswordScore.Strong:
    case PasswordScore.VeryStrong:
           // Password deemed strong enough, allow user to be added to database etc
           break;
}

この場合、列挙型は、パスワードの強度を人間が読める形式のグループに分類する手段として使用されます。コードをクリーンに保ち、コードで何が起こっているかを明確にします。

正規表現の使用に関して、それらの概念と使用方法および使用時期に慣れていない場合は、文字列のパターンをチェックするためのさまざまなシナリオで役立つ可能性があるため、調査を行うことをお勧めします。おそらくここから始めましょう。

于 2012-10-15T16:30:18.470 に答える