2011-06-08 38 views
0

我必須創建一個密碼強度檢查器,但我無法獲得的唯一要求是「不是字典中的單詞或專有名稱」。我有一個60兆字節的文本文件。例如,當你使用「測試」時,它會失敗,但如果你使用test123,它會在失敗時通過。密碼要求 - 不是字典的單詞或專有名稱

我該代碼是:

int counter = 0; 
string line; 
while ((line = file.ReadLine()) != null) 
{ 
    if (line.Contains(pwd)) { return false; } 
    counter++; 
} 

我將如何分析用戶的密碼拉了字典中的單詞?

或者我應該嘗試實施一個正則表達式,迫使每3個字符是一個數字或特殊字符,避免字典文件一起?謝謝。

+3

你還沒有定義你想要失敗的東西。 'test123'不是詞典單詞。你不能簡單地說「任何包含字典單詞的東西」,因爲1)沒有意義,2)有很常見的短字符串是字典單詞,比如'a'。你不想拒絕每個包含'a'的密碼 – CodesInChaos 2011-06-08 13:53:14

+1

「Qj16!!!」(注意「中間的」)有效還是無效?我問,因爲「test123」不是一個字典詞,它只包含一個。真正的要求是什麼?密碼是否可以包含「a」或「I」? – 2011-06-08 13:54:16

+2

關於你的「或」建議,強制「每個* n *字符是* x *類型」的想法不會讓你走上安全之路。首先,你已經公佈了關於如何破解它的第一個細節。 – 2011-06-08 13:54:26

回答

1

爲什麼你不把它放在SQLite中並做簡單的查詢?

+0

如果這是c#(如標籤)linq查詢保證可用... sqlite似乎矯枉過正,當你有一個內置的查詢語法 – 2011-06-08 14:51:48

0

如果將Word加載到服務器上,則可以使用內部字典進行檢查,或使用字典Web服務(如this)查看字典中是否存在單詞。如果結果被返回,那麼你可以假設它是一個字典單詞。

0

我會將這些單詞存儲在程序開始的列表中,並從那裏開始工作。

List<String> words = new List<String>(); 

while (!file.EndOfStream) 
{ 
    line = file.ReadLine(); 
    words.AddRange(line.split(","); //assuming a csv file. 
} 

bool passWordCheck() 
{ 
    foreach(string x in words) 
    { 
     if (passWord.contains(x)) 
      return false; 
    } 
    return true; 
} 
1

你真正想要的是計算密碼的熵。分析字符的哪個子集或者是否使用了字典單詞只是更好地估計熵的工具。

字典單詞的問題在於,它們相關的熵通常與它們的長度相比非常低。所以你應該爲字典單詞添加更少的熵,而不是明顯隨機的字符。

1

您的代碼幾乎是您的應用的拒絕服務引擎。將字典導入到SQL數據庫,然後使用SQL查詢進行匹配。

IF NOT EXISTS (SELECT Word FROM Dictionary WHERE Word LIKE '%' + @Passowrd + '%') 

會做這項工作。

至於其他人提到你似乎試圖禁止包含字典中的單詞的密碼,這是非常愚蠢和混亂爲您的用戶並沒有真正提供附加的安全。你真的應該只是在尋找密碼,這是字典詞,即測試是壞的,但test123罰款。如果是這樣的SQL將更有效:

IF NOT EXISTS (SELECT Word FROM Dictionary WHERE Word = @Passowrd) 
0

你應該真的聽安全現在播客#303。密碼強度進行了深入討論。

另見:https://www.grc.com/haystack.htm這應該指向你在正確的方向。

相關問題