web-dev-qa-db-ja.com

文字列で十分に強力なパスワードを確認する

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

文字列から特定の条件(具体的にはパスワードの強度)を検索するための最良の方法を実現するにはどうすればよいのだろうと思っていました。

これまでのところ簡単です:

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

大文字を確認したいのですが、方法や手順がわかりません。私はグーグルを試し、ウェブサイトを検索しました: http://msdn.Microsoft.com 、そして私のC#ブック(C#プログラミング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倍にする必要があります。これを行うためのより良い方法、または少なくとも上記で示した方法の省略形があると私は確信しています。

また、特殊文字のパスワードを確認することもできます(上記の例では、大文字と小文字よりも簡単に見えるので、必要に応じて、特殊文字にのみ使用できます)。それを行うための簡単な(または適切な)方法がある場合は、その知識も教えてください。

とにかく、だれでもできるどんな助けにも本当に感謝します。

19
VoidKing

here からこれを盗んだため、クレジットを取得できません。

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

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

正規表現の使用に関して、それらの概念と、それらをいつどのように使用するかをよく知らない場合は、いくつかの調査を行うことをお勧めします。これらは、文字列のパターンをチェックするためのさまざまなシナリオで役立ちます。多分 ここ から始めてください。

60
Steve Kennaird