我有一个密码列表,我需要检查并确定它们是否符合AD的默认3 of 4规则。
规则包含以下4项要求中的3项: 小写字符(a-z) 大写字符(A-Z) 数字(0-9) 特殊字符(!@#$%^& *()_ + =)
我还在学习正则表达式。我知道如何选择那些符合任何一个角色案例的人,但我不知道如何做到4个中的3个。
作为旁注,AD复杂性还有两个重要的细微之处(但不在原始问题的范围之内)。
它实际上是第3个。第五个是Unicode字符。很高兴用这个更新正则表达式。
另一个是你不能在密码中整体使用sAMAccountName值(不区分大小写),也不能将displayName值拆分为以空格,逗号,短划线,下划线,磅,管道和其他标记分割的标记( <3个字符或更长)不能在密码中整体,不区分大小写。
答案 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。