如何验证密码是不是包含 X 大写字母和 Y 数字?

Posted

技术标签:

【中文标题】如何验证密码是不是包含 X 大写字母和 Y 数字?【英文标题】:How to verify that the password contains X uppercase letters and Y numbers?如何验证密码是否包含 X 大写字母和 Y 数字? 【发布时间】:2012-01-14 22:03:48 【问题描述】:

如何在 C# 中验证密码至少包含 X 个大写字母和至少 Y 个数字,并且整个字符串比 Z 长?

谢谢。

【问题讨论】:

我可能会使用一些标准的密码验证规则,可能与 RegEx 一起使用,而不是逐字符解析...请参阅这个:***.com/questions/1152872/… 【参考方案1】:

计算大写字母和数字:

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 的长度

祝你好运!

【讨论】:

【参考方案2】:

密码强度:

首先,我会阅读密码强度,并仔细检查您的政策以确保您所做的事情是正确的(我无法立即告诉您):

http://en.wikipedia.org/wiki/Password_strength https://www.grc.com/haystack.htm http://xkcd.com/936/(开个玩笑,但值得深思)

然后我会检查其他问题:

Creating a regex to check for a strong password Password strength

那我就说正事了。

实施:

你可以使用 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);

【讨论】:

@SaiKalyanAkshinthala:现已修复。我在扩展答案时看到了我的错误:)【参考方案3】:

使用 LINQ 简洁明了 Where() method:

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;

【讨论】:

【参考方案4】:

应该这样做:

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;

【讨论】:

以上是关于如何验证密码是不是包含 X 大写字母和 Y 数字?的主要内容,如果未能解决你的问题,请参考以下文章

如何验证字符串是不是仅包含字母、数字、下划线和破折号?

密码验证 8 位数字,包含大写、小写和特殊字符

js正则表达式密码验证必须包含数字和字母

JS 用正则表达式,验证密码包含数字和字母的方法

检查密码,验证,然后再次循环

正则表达式验证密码必须由大小写字母、数字、特殊字符组成