正则表达式验证Active Directory默认密码复杂性

时间:2009-04-21 20:57:26

标签: regex active-directory passwords

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

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

我还在学习正则表达式。我知道如何选择那些符合任何一个角色案例的人,但我不知道如何做到4个中的3个。

作为旁注,AD复杂性还有两个重要的细微之处(但不在原始问题的范围之内)。

它实际上是第3个。第五个是Unicode字符。很高兴用这个更新正则表达式。

另一个是你不能在密码中整体使用sAMAccountName值(不区分大小写),也不能将displayName值拆分为以空格,逗号,短划线,下划线,磅,管道和其他标记分割的标记( <3个字符或更长)不能在密码中整体,不区分大小写。

4 个答案:

答案 0 :(得分:13)

如果你真的想要一个大的正则表达式,它将是这样的:

(?=^.{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个字符之间。您可以更改第一部分中的“{8,255}”部分以调整长度要求。值得注意的是,这在标准的ASP.NET RegularExpressionValidator控件中对我有用。

匹配:“Passw0rd”“passW @ rd”“1B2a345 @#$%”

不匹配:“123123123”“密码”“asdf&amp; amp;”

Source(Matthew Hazzard通过RegExLib.com)

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

我不确定我是否正确转义了特殊字符。它取决于您正在使用的语言/工具包。

答案 3 :(得分:0)

我编辑了@saul-dolgin个答案,与问题中指定的有效字符集完全匹配(不是非字母数字字符[^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。