代码之家  ›  专栏  ›  技术社区  ›  geoffc

验证Active Directory默认密码复杂性的regex

  •  5
  • geoffc  · 技术社区  · 16 年前

    我有一个密码列表,需要检查并确定它们是否符合AD的默认4规则3。

    规则包含以下4项要求中的3项: 小写字符(A-Z) 大写字符(A-Z) 数字(0~9) 特殊字符(!@#$%^&*()(+=)

    我还在学雷吉克斯。我知道如何只选择那些符合任何一个字符大小写的字符,但我不知道如何选择4个字符中的3个。

    作为旁注,广告的复杂性还有两个更为微妙的方面,这一点很重要(但超出了最初问题的范围)。

    实际上是五分之三。第五个是Unicode字符。很高兴用它更新regex。

    另一种情况是,您不能在密码中使用完整的samaccountname值(不区分大小写),也不能将displayname值拆分为按空格、逗号、破折号、下划线、磅、管道等拆分的标记,这些标记(3个字符或更长)在密码中不能是完整的,不区分大小写。

    4 回复  |  直到 10 年前
        1
  •  13
  •   Saul Dolgin    15 年前

    如果你真的想要一个大的regex,应该是这样的:

    (?=^.{8,255}$)((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))^.*
    

    注意,它还强制密码长度在8到255个字符之间。您可以更改第一节中的“8255”部分,以调整长度要求。同样值得注意的是,这在标准ASP.NET中对我很有用。 RegularExpressionValidator 控制。

    匹配:“passw0rd”“passw@rd”“1B2A345@$%”

    不匹配:“123123123”“password”“asdf&”

    Source (马修·哈扎德通过regexlib.com)

        2
  •  2
  •   JP Alioto    16 年前

    它必须都是一个大的正则表达式吗?你可以做4个正则表达式,每个正则表达式检查一件事,然后确保4个正则表达式中的3个是匹配的。这将更容易,更不容易出错,更易于维护。

        3
  •  1
  •   moinudin    16 年前

    您必须像这样构建正则表达式:

    rule = [ "[a-z]", "[A-Z]", "[0-9]", "[!@#$%\^\&\(\)\+=]" ]
    
    regex = ""
    first = true
    for a in 0..3:
      for b in 0..3:
        if a == b: continue
        for c in 0..3:
          if a == c or b == c: continue
          if not first:
            regex += "|"
          regex += "(" + rule[a] + ".*" + rule[b] + ".*" + rule[c] + ")"
          first = false
    

    我不确定我是否正确地避开了那些特殊人物。这取决于您使用的语言/工具包。

        4
  •  0
  •   Community CDub    8 年前

    我编辑了 @saul-dolgin 回答与问题中指定的有效字符集完全匹配(不是非alfanumeric字符 [^A-Za-z0-9] ):

    (?=^[A-Za-z\d!@#\$%\^&\*\(\)_\+=]{8,20}$)((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[!@#\$%\^&\*\(\)_\+=])(?=.*[a-z])|(?=.*[!@#\$%\^&\*\(\)_\+=])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[!@#\$%\^&\*\(\)_\+=]))^.*
    

    Microsoft强制密码仅包含其列表中的字符。 我还把最大长度改为20。