2009-04-21 24 views
5

我有一个需要检查的密码列表,并确定它们是否符合AD的默认3或4规则。验证Active Directory默认密码复杂性的正则表达式

规则是包含的4所以下要求3: 小写字母(AZ) 大写字母(AZ) 数字(0-9) 特殊字符(@#$%^ * &()_ + =)

我还在学习正则表达式。我知道如何选择只符合任何一个字符的情况,但我不确定如何做3或4.

作为一个方面说明,AD复杂性有两个更重要的细节(但超出范围原始问题)。

确实是3的5。第五个是Unicode字符。很高兴用它来更新正则表达式。

另一个是你不能在整个密码中设置sAMAccountName的值(不区分大小写),也不能将displayName的值拆分为空格,逗号,短划线,下划线,井号,管道和其他别的东西(3个字符以上)不能全部在密码中,不区分大小写。

回答

11

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

(?=^.{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 &放大器;”

Source(马太福音通过RegExLib.com哈扎德)

+0

优雅!我喜欢! – geoffc 2010-07-02 20:14:31

+0

只要测试这种方法,我会发现't3st33#3'显示为有效的情况,但't3st33#33'不显示。 – stevemac 2011-06-28 05:12:24

1

你将不得不建立起来的正则表达式是这样的:

rule = [ "[a-z]", "[A-Z]", "[0-9]", "[[email protected]#$%\^\&\(\)\+=]" ] 

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 

我不知道我是否正确转义的特殊字符。这是依赖于你正在使用的语言/工具包。

2

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

+0

那么一个大的正则表达式会更容易使用。我还没有决定使用它的工具。倾向于Perl,但实际上可能会在DirXML Script的Novell Identity Manager中实现,因为它已经在IDM系统中。 – geoffc 2009-04-22 12:40:44

0

我编辑的@saul-dolgin答案完全匹配,在这个问题(没有AA非alfanumeric字符[^A-Za-z0-9])指定的有效字符集:

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

微软强制密码只有他们的列表中的字符。 我也改变了最大长度为20.