2012-10-15 22 views
11

thể trùng lặp:
Strong password regex
Need RegEx for password strength?chuỗi Kiểm tra cho một mật khẩu đủ mạnh

Tôi chỉ tự hỏi những cách tốt nhất để tìm kiếm một chuỗi cho tiêu chí nhất định (sức mạnh mật khẩu để cụ thể) có thể được thực hiện.

Cho đến nay tôi có một đơn giản:

if(password.Length <= 7) 
    { 
     errorMessage = "Your password must be at least 8 characters."; 
    } 

Tôi muốn để có thể kiểm tra chữ in hoa, nhưng tôi không chắc chắn những gì các phương pháp hay thủ tục là. Tôi đã thử dùng Googling, tìm kiếm trên trang web: http://msdn.microsoft.com và tìm kiếm chỉ mục của cuốn sách C# của tôi (Lập trình C# 3E, của Barbara Doyle), nhưng tôi dường như không tìm thấy bất kỳ thứ gì.

Tôi biết tôi có thể thử này ...:

foreach(char c in password) 
    { 
     if(c!='A' || c!='B' || c!='C' || c!='D' ..... || c!='Z') 
     { 
      errorMessage = "Your password must contain at least one capital letter"; 
     } 
    } 

... Nhưng điều đó sẽ là vô cùng cẩu thả, và sẽ phải được tăng gấp đôi để kiểm tra ít nhất một chữ cái thường. Tôi chắc chắn có một cách tốt hơn để làm điều này, hoặc ít nhất là viết tắt của phương pháp tôi đã trình bày ở trên.

Ngoài ra, tôi có thể quyết định kiểm tra mật khẩu cho các ký tự đặc biệt (có vẻ dễ hơn trong ví dụ trên so với chữ hoa và chữ thường).). Nếu có một cách dễ dàng (hoặc thích hợp) để làm điều đó, tôi cũng muốn có kiến ​​thức đó.

Dù sao, cảm ơn bạn rất nhiều vì bất kỳ trợ giúp nào mà bất kỳ ai cũng có thể cung cấp.

+2

Đây không phải là câu trả lời, nhưng hãy đảm bảo bạn hiểu http://xkcd.com/936/ và http://xkcd.com/792/ Và tôi cũng khuyên bạn nên đọc http://www.codinghorror.com /blog/2010/12/the-dirty-truth-about-web-passwords.html và tìm kiếm trang web của Jeff cho các bài viết có liên quan khác. Sau đó, hãy xem Cụm từ thông dụng để xác minh độ dài/độ phức tạp phù hợp. – David

+0

Thay vì một loạt các mệnh đề 'if ... then', bạn có thể muốn chạy mật khẩu thông qua một biểu thức chính quy. Hãy xem [SO trả lời] này (http://stackoverflow.com/questions/3131025/strong-password-regex). Tôi nghĩ rằng nó cung cấp các biểu thức thông thường sẽ giúp bạn. –

+0

@DarinDimitrov Hey, cảm ơn vì điều đó, tôi không thấy liên kết đó, bởi vì tôi không biết tìm kiếm regex (mặc dù, tôi đoán là nó rõ ràng). Lời xin lỗi của tôi, và thnx cho liên kết! – VoidKing

Trả lời

42

Tôi không thể lấy tín dụng, như tôi đã đánh cắp này từ here

using System.Text; 
using System.Text.RegularExpressions; 

    public enum PasswordScore 
    { 
    Blank = 0, 
    VeryWeak = 1, 
    Weak = 2, 
    Medium = 3, 
    Strong = 4, 
    VeryStrong = 5 
    } 

    public class PasswordAdvisor 
    { 
    public static PasswordScore CheckStrength(string password) 
    { 
     int score = 0; 

     if (password.Length < 1) 
     return PasswordScore.Blank; 
     if (password.Length < 4) 
     return PasswordScore.VeryWeak; 

     if (password.Length >= 8) 
     score++; 
     if (password.Length >= 12) 
     score++; 
     if (Regex.Match(password, @"/\d+/", RegexOptions.ECMAScript).Success) 
     score++; 
     if (Regex.Match(password, @"/[a-z]/", RegexOptions.ECMAScript).Success && 
     Regex.Match(password, @"/[A-Z]/", RegexOptions.ECMAScript).Success) 
     score++; 
     if (Regex.Match(password, @"/.[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]/", RegexOptions.ECMAScript).Success) 
     score++; 

     return (PasswordScore)score; 
    } 
    } 

Lưu ý việc sử dụng regex để kiểm tra đối với trường hợp tự in hoa. Điều này dường như là một cách tiếp cận tốt, vì nó kiểm tra độ dài, sử dụng các ký tự chữ hoa và chữ thường, chữ số và các ký tự đặc biệt.

** Update **

Tôi biết câu hỏi bây giờ được đóng lại, nhưng tôi có thể thêm lời giải thích nhiều hơn cho VoidKing để hiểu một số khái niệm.

Mật khẩuScore được trả về từ phương pháp CheckStrength, có thể được sử dụng làm điều kiện cho những việc cần làm tiếp theo trong mã của bạn.

Dưới đây là một bản demo chưa được kiểm tra về cách thức mã trên có thể được sử dụng:

String password = "MyDummy_Password"; // Substitute with the user input string 
PasswordScore passwordStrengthScore = PasswordAdvisor.CheckStrength(password); 

switch (passwordStrengthScore) { 
    case PasswordScore.Blank: 
    case PasswordScore.VeryWeak: 
    case PasswordScore.Weak: 
      // Show an error message to the user 
      break; 
    case PasswordScore.Medium: 
    case PasswordScore.Strong: 
    case PasswordScore.VeryStrong: 
      // Password deemed strong enough, allow user to be added to database etc 
      break; 
} 

Enums được sử dụng trong trường hợp này như một phương tiện để phân loại sức mạnh của mật khẩu vào nhóm người có thể đọc. Giữ mã sạch sẽ, và làm cho nó rõ ràng những gì đang xảy ra trong mã.

Về việc sử dụng Regex, nếu bạn không quen với khái niệm về chúng và cách sử dụng chúng, tôi đề nghị thực hiện một số nghiên cứu vì chúng có thể hữu ích trong nhiều trường hợp khác nhau để kiểm tra mẫu. Có lẽ bắt đầu here.

+0

Dude, bạn xứng đáng với một số đại diện, chỉ vì mức độ hữu ích này là tổng thể ... Cho đến bây giờ, tôi không biết họ đánh giá mật khẩu trên quy mô đó như thế nào ... Cảm ơn bạn! – VoidKing

+0

Regex này hoạt động chính xác như thế nào? Tôi muốn có thể tự làm. Tôi có giả định rằng nó kiểm tra từng ký tự (và các ký tự kế tiếp nếu trước đó là một kết quả phù hợp) cho các kết quả phù hợp trong chuỗi regex được cung cấp? (tha thứ cho tôi nếu tôi không sử dụng regex đúng cách, nói theo ngữ pháp) – VoidKing

+0

Vâng, tôi đã thử điều này, nhưng tôi không biết đủ về quy trình này. Tôi chỉ bắt đầu đường dẫn đến (hoặc sử dụng hoặc bất cứ cái gì được gọi là nó) các tệp .cs bên ngoài và tôi có thể làm điều đó, nhưng dường như tôi không thể làm việc với bất kỳ dữ liệu nào mà lớp này được cho là cung cấp. Nó không bao giờ đủ để tôi có mã, tôi cũng phải hiểu nó để thực hiện nó vào các ứng dụng của tôi, và tôi đơn giản đặt, không, ở đây. ECMAScript là gì? tại sao enum? loại dữ liệu nào được trả về? (Tôi phát hiện ra tôi không thể đúc nó vào bất cứ điều gì có thể sử dụng được). Dù sao, cảm ơn vì đã cố gắng giúp đỡ. – VoidKing