Как проверить, что пароль содержит X заглавных букв и Y цифр? - PullRequest
8 голосов
/ 07 декабря 2011

Как проверить в C #, что пароль содержит не менее X заглавных букв и не менее Y цифр, а вся строка длиннее Z?

Спасибо.

Ответы [ 4 ]

9 голосов
/ 07 декабря 2011

Надежность пароля:

Во-первых, я прочитал о надежности пароля и дважды проверил вашу политику, чтобы убедиться, что вы делаете правильные вещи (я не могу сказать вам от руки):

Тогда я бы проверил другие вопросы:

Тогда я бы приступил к делу.

Реализация:

Вы можете использовать Linq:

return password.Length >= z
    && password.Where(char.IsUpper).Count() >= x
    && password.Where(char.IsDigit).Count() >= y
    ;

Вы можете использовать также регулярные выражения (которыеможет быть хорошим вариантом, позволяющим вам в будущем подключать более сложные проверки):

return password.Length >= z
    && new Regex("[A-Z]").Matches(password).Count >= x
    && new Regex("[0-9]").Matches(password).Count >= y
    ;

Или вы можете смешивать и сопоставлять их.

Если вам приходилось делать это несколько разВы можете повторно использовать Regex экземпляры, создав класс:

public class PasswordValidator
{
    public bool IsValid(string password)
    {
        return password.Length > MinimumLength
            && uppercaseCharacterMatcher.Matches(password).Count
                >= FewestUppercaseCharactersAllowed
            && digitsMatcher.Matches(password).Count >= FewestDigitsAllowed
            ;
    }

    public int FewestUppercaseCharactersAllowed { get; set; }
    public int FewestDigitsAllowed { get; set; }
    public int MinimumLength { get; set; }

    private Regex uppercaseCharacterMatcher = new Regex("[A-Z]");
    private Regex digitsMatcher = new Regex("[a-z]");
}

var validator = new PasswordValidator()
{
    FewestUppercaseCharactersAllowed = x,
    FewestDigitsAllowed = y,
    MinimumLength = z,
};

return validator.IsValid(password);
7 голосов
/ 07 декабря 2011

Для подсчета заглавных букв и цифр:

string s = "some-password";
int upcaseCount= 0;
int numbersCount= 0;
for (int i = 0; i < s.Length; i++)
{
    if (char.IsUpper(s[i])) upcaseCount++; 
    if (char.IsDigit(s[i])) numbersCount++;
}

и проверьте s.Length на длину

удачи!

1 голос
/ 07 декабря 2011

Коротко и ясно используя метод LINQ Где () :

int requiredDigits = 5;
int requiredUppercase = 5;
string password = "SomE TrickY PassworD 12345";

bool isValid = password.Where(Char.IsDigit).Count() >= requiredDigits
               && 
               password.Where(Char.IsUpper).Count() >= requiredUppercase;
0 голосов
/ 07 декабря 2011

Это должно сделать это:

public bool CheckPasswordStrength(string password, int x, int y, int z)
{
   return password.Length >= z &&
          password.Count(c => c.IsUpper(c)) >= x &&
          password.Count(c => c.IsDigit(c)) >= y;
}
...