2012-10-15 26 views
11

可能重複:
Strong password regex
Need RegEx for password strength?檢查字符串足夠強的密碼

我只是想知道什麼是最好的方法來搜索特定標準的字符串(密碼強度,以具體)可以完成。

到目前爲止,我有一個簡單的:

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

我想能夠檢查大寫字母,但我不知道有什麼方法或程序。我嘗試過使用谷歌搜索,搜索網站:http://msdn.microsoft.com,並搜索我的C#書籍(C#編程3E,由芭芭拉Doyle)索引,但我似乎無法找到任何。

我知道我可以試試這個...:

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"; 
     } 
    } 

...但是,這將是非常草率,並必須加倍檢查至少一個小寫字母。我相信有一個更好的方法來做到這一點,或者至少是我上面顯示的方法的簡寫。

此外,我可能會決定檢查特殊字符的密碼(在上面的示例中,似乎比使用大寫和小寫字母更容易做到,所以我可能會將其用於特殊字符,我是否應該決定是否需要特殊字符)。如果有一個簡單(或適當)的方法來做到這一點,我也很想擁有這些知識。

無論如何,非常感謝任何人都可以給予的幫助。

+2

這不是一個答案,但一定要明白http://xkcd.com/936/和http://xkcd.com/792/我也推薦閱讀http://www.codinghorror.com /blog/2010/12/the-dirty-truth-about-web-passwords.html並在Jeff的網站上搜索其他相關文章。然後查看正則表達式以驗證適當的長度/複雜性。 – David

+0

您可能想要通過正則表達式運行密碼,而不是一系列'if ... then'子句。看看這個[SO回答](http://stackoverflow.com/questions/3131025/strong-password-regex)。我認爲它提供了可以幫助你的正則表達式。 –

+0

@DarinDimitrov 嘿,謝謝你,我沒有看到這個鏈接,因爲我不知道要搜索正則表達式(儘管我猜它很明顯)。我的道歉,thnx的鏈接! – VoidKing

回答

42

我不能居功,因爲我偷了這個從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; 
    } 
    } 

注意使用正則表達式的用於檢查大寫字符。 這似乎是一個體面的方法,因爲它會檢查長度,使用大寫和小寫字符,數字和特殊字符。

** **更新

我知道現在的問題是封閉的,但我可以添加更多的解釋VoidKing瞭解一些概念。

PasswordScore從CheckStrength方法返回,它可以作爲您的代碼中下一步操作的條件。

以下是如何上面的代碼可以使用一種未經試驗的演示:

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; 
} 

枚舉在這種情況下使用作爲密碼的強度分類爲人類可讀的基團的一種手段。保持代碼清潔,並明確代碼中發生了什麼。

關於正則表達式的使用,如果您不熟悉它們的概念以及如何以及何時使用它們,我建議您做一些研究,因爲它們可以用於檢查字符串中的模式的許多不同場景。也許開始here

+0

老兄,你應該得到一些代表,只是爲了這是多麼有用...直到現在,我不知道他們如何評估密碼在這個規模...... 謝謝! – VoidKing

+0

這個正則表達式是如何工作的?我希望能夠做到我自己的。我是否正確地假設它檢查每個字符(如果以前是匹配,則繼續輸入字符)以匹配正則表達式字符串中的匹配項? (原諒我,如果我沒有正確使用正則表達式,語法上) – VoidKing

+0

嗯,我正在嘗試這個,但我只是不知道這個過程。我剛剛開始尋找(或使用或任何其所謂的)外部.cs文件,我可以這樣做,但我似乎無法處理該類應提供的任何數據。我擁有代碼是不夠的,我必須理解它才能將它實現到我的應用程序中,而我只是在這裏放置,不要。什麼是ECMAScript?爲什麼enum?什麼樣的數據被返回? (我發現我不能將它投入任何可用的東西)。無論如何,感謝您的幫助。 – VoidKing