2010-06-28 49 views
7

tôi cần mạnh mẽ xác nhận mật khẩu regexmạnh mật khẩu regex

Special Characters - Not Allowed 
Spaces - Not Allowed 
Numeric Character - At least one character 
At least one Capital Letter 
Minimum and Maximum Length of field - 6 to 12 Characters 
Repetitive Characters - Allowed only two repetitive characters 

Regex của tôi là ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s)(?=(?:(\w)(?!\1{2}))+).{6,12}$ nhưng nó bỏ qua ký tự đặc biệt (nơi để thêm?)

Xin giúp!

+12

Điều gì khiến bạn tin rằng biểu thức chính quy là cách tốt nhất để giải quyết vấn đề này? –

+7

Tại sao bạn không cho phép không gian và các ký tự đặc biệt? Điều đó không làm cho nó trở thành một regex * yếu * mật khẩu, thay vì một mật khẩu mạnh? Tiêu chí của bạn cũng không cho phép người dùng nhập cụm mật khẩu (một chuỗi từ, dài hơn mật khẩu thông thường) vì bạn yêu cầu chữ số, không có dấu cách và giới hạn độ dài của mật khẩu. – Douglas

+0

Douglas, các ký tự đặc biệt chỉ được phép (@) tuy nhiên: *, -, + etc không được phép sử dụng các ký tự đặc biệt. Đây là một nhiệm vụ :) – Maxim

Trả lời

24
^(?=.*[A-Z])(?=.*\d)(?!.*(.)\1\1)[[email protected]]{6,12}$ 
  • Nhân vật đặc biệt - không được phép
  • Spaces - Không Được phép
  • tối thiểu và chiều dài tối đa của trường - 6 đến 12 ký tự
    Met bởi [[email protected]]{6,12}
  • Ký tự số - Ít nhất một ký tự
    Met bởi positive lookahead(?=.*\d)
  • Ít nhất một Capital Letter
    Met bởi lookahead dương (?=.*[A-Z])
  • nhân vật lặp đi lặp lại - Được phép chỉ có hai nhân vật lặp đi lặp lại
    Tôi không chắc chắn những gì bạn có nghĩa là bằng cách này. Các lookahead tiêu cực (?!.*(.)\1\1) đảm bảo rằng không có nhân vật nào được phép xuất hiện nhiều hơn hai lần liên tiếp. Chuỗi con aa là không sao, aaa thì không.
    Biến nó thành (?!.*(.+)\1\1) để loại bỏ các bản lặp lại có chiều dài nhiều hơn một (như ababab) hoặc thêm .* trước \1 để từ chối xuất hiện lặp lại không liên tục.
+0

Nhân vật lặp lại - ý tôi là: được cho phép bằng mật khẩu và không được phép sử dụng mật khẩu hoặc mật khẩu. Những gì tôi cần phải làm trong trường hợp này? – Maxim

+0

Tôi vẫn khăng khăng rằng mã của tôi dễ đọc hơn/dễ bảo trì hơn! Bah, regex cho everyting và bất cứ điều gì. – Noldorin

+1

@Maxim Có vẻ như sự hiểu biết của tôi là chính xác. Regex đã cho nên làm điều đó. – Amarghosh

29

Không giống như một tác vụ đặc biệt phù hợp với Regex, vì bạn muốn kiểm tra nhiều điều kiện cùng một lúc. (Bạn có thể sử dụng nhiều regexes, nhưng sau đó bình thường C# với LINQ là một cách đẹp hơn để kiểm tra nó.) Hãy thử các chức năng sau:

public static bool IsStrongPassword(string password) 
{ 
    // Minimum and Maximum Length of field - 6 to 12 Characters 
    if (password.Length < 6 || password.Length > 12) 
     return false; 

    // Special Characters - Not Allowed 
    // Spaces - Not Allowed 
    if (!(password.All(c => char.IsLetter(c) || char.IsDigit(c)))) 
     return false; 

    // Numeric Character - At least one character 
    if (!password.Any(c => char.IsDigit(c))) 
     return false; 

    // At least one Capital Letter 
    if (!password.Any(c => char.IsUpper(c))) 
     return false; 

    // Repetitive Characters - Allowed only two repetitive characters 
    var repeatCount = 0; 
    var lastChar = '\0'; 
    foreach(var c in password) 
    { 
     if (c == lastChar) 
      repeatCount++; 
     else 
      repeatCount = 0; 
     if (repeatCount == 2) 
      return false; 
     lastChar = c; 
    } 

    return true; 
} 

Hãy chắc chắn rằng bạn nhập System.Linq tất nhiên, và bạn thiết lập để đi.

+0

Ký tự lặp lại? – Maxim

+0

Có lẽ một người có thể kết hợp phương pháp tiếp cận LINQ ở trên với một vài biểu hiện mà các công cụ kiểm tra mà regexps là tốt? –

+1

@Maxim: Đã chỉnh sửa, được bao gồm ngay bây giờ. Nhân vật lặp đi lặp lại là bài kiểm tra duy nhất tôi * có thể * sử dụng regex, nhưng tôi nghĩ rằng cách tiếp cận hiện tại vẫn ổn. – Noldorin

2

Trong câu trả lời của Noldorin các char.IsNumeric nên được thay thế bởi char.IsDigit cho C#/NET 4.0

1

Plugin Jquery sau gọi pwdMeter hoạt động và có vẻ như là một cách tuyệt vời để hiển thị cho người dùng những gì và không phải là mật khẩu mạnh.

http://shouvik.net/pwdmeter.php

+0

điều này thực sự khá tuyệt vời – Eliseo

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