Проверка строк для достаточно сильного пароля

Возможный дубликат:
Сильное регулярное выражение пароля
Нужен RegEx для защиты паролем?

Мне просто интересно, что лучший способ поиска строки по определенным критериям (определенная степень пароля) может быть выполнена.

До сих пор я прост:

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

Я хотел бы иметь возможность проверять заглавные буквы, но я не уверен, что это за метод или процедура. Я попробовал Google, выполнив поиск на веб-сайте: http://msdn.microsoft.com и поиск индекса моей книги С# (С# 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

Я не могу взять кредит, так как я украл это из здесь

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

В этом случае перечисления используются как средство классификации силы пароля в удобочитаемые группы. Сохраняет код в чистоте и делает очевидным, что происходит в коде.

Что касается использования регулярных выражений, если вы не знакомы с их концепцией и как и когда их использовать, я предлагаю сделать некоторые исследования, поскольку они могут быть полезны во многих разных сценариях для проверки шаблонов в строках. Возможно, начните здесь.