2009-04-21 68 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.