2009-04-21 36 views
5

Tôi có một danh sách mật khẩu mà tôi cần kiểm tra và xác định xem chúng có đáp ứng quy tắc 3 trong 4 mặc định cho AD hay không.Regex xác nhận hợp lệ mật khẩu mặc định của Active Directory

Rule là có 3 trong 4 yêu cầu sau: chữ thường ký tự (az) trên kiểu chữ (AZ) số (0-9) ký tự đặc biệt (@ # $%^& *() _ + =)

Tôi vẫn đang học Regex. Tôi biết cách chỉ chọn những người đáp ứng bất kỳ trường hợp nhân vật nào, nhưng tôi không chắc chắn cách thực hiện 3 của 4.

Như một lưu ý, AD Complexity có hai tinh vi quan trọng hơn (nhưng nằm ngoài phạm vi của câu hỏi gốc).

Nó thực sự là 3 của 5. Thứ năm là ký tự Unicode. Được tốt đẹp để cập nhật Regex với điều đó.

Khác là bạn không thể có giá trị sAMAccountName toàn bộ trong mật khẩu (phân biệt chữ hoa chữ thường), cũng không phải nếu bạn chia giá trị displayName thành mã thông báo chia theo không gian, dấu phẩy, dấu gạch ngang, dấu gạch dưới, bảng, đường ống và thứ khác (3 ký tự và lâu hơn) không thể là toàn bộ trong mật khẩu, không phân biệt chữ hoa chữ thường.

Trả lời

11

Nếu bạn thực sự muốn một regex lớn nó sẽ là một cái gì đó như thế này:

(?=^.{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]))^.* 

Lưu ý rằng nó cũng thực thi dài mật khẩu là từ 8 đến 255 ký tự. Bạn có thể thay đổi phần "{8.255}" trong phần đầu tiên để điều chỉnh các yêu cầu về độ dài. Nó cũng đáng chú ý rằng điều này là làm việc cho tôi trong một tiêu chuẩn ASP.NET RegularExpressionValidator kiểm soát.

Matches: "Passw0rd" "passW @ thứ" "1B2a345 @ # $%"

Non-Matches: "123.123.123" "Mật khẩu" "asdf & amp;"

Source (Matthew Hazzard qua RegExLib.com)

+0

Classy! Tôi thích nó! – geoffc

+0

Chỉ cần thử nghiệm phương pháp này mang lại cho tôi để tìm một trường hợp 't3st33 # 3' xuất hiện là hợp lệ, nhưng 't3st33 # 33' thì không. – stevemac

+0

Và mật khẩu1 cũng hiển thị là hợp lệ. – geoffc

1

Bạn sẽ phải xây dựng biểu thức chính quy như thế này:

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 

Tôi không chắc chắn nếu tôi thoát khỏi nhân vật đặc biệt một cách chính xác. Đó là loại phụ thuộc vào ngôn ngữ/bộ công cụ bạn đang sử dụng.

2

Nó có phải là tất cả một regex lớn không? Bạn có thể làm 4 regex, mỗi kiểm tra một điều và sau đó đảm bảo 3 trong số 4 là phù hợp. Điều đó sẽ dễ dàng hơn, ít bị lỗi hơn và dễ bảo trì hơn.

+0

Một regex lớn sẽ dễ sử dụng hơn. Tôi vẫn chưa quyết định về công cụ tôi sẽ sử dụng nó. Leaning hướng tới Perl, nhưng thực sự có thể sẽ làm điều đó trong Novell Identity Manager trong DirXML Script, vì nó đang ở trong một hệ thống IDM rồi. – geoffc

0

Tôi chỉnh sửa các câu trả lời @saul-dolgin so sánh chính xác với charset hợp lệ nêu tại câu hỏi (không aa nhân vật phi 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]#\$%\^&\*\(\)_\+=]))^.* 

Microsoft buộc mật khẩu chỉ có các ký tự trong danh sách của chúng. Tôi cũng đã thay đổi chiều dài tối đa thành 20.

+0

Tôi khá chắc chắn "các ký tự trong danh sách của họ" bao gồm tất cả các ký tự, bao gồm dấu cách, dấu phẩy, v.v. .. https://technet.microsoft.com/en-us/library/cc786468(v=ws.10).aspx – Nicow

+0

Tôi có nghĩa là các ký hiệu khác không được liệt kê phù hợp trong '[^ A-Za-z0-9] 'mẫu. ví dụ euro, pound, yen ... – kpull1

Các vấn đề liên quan