2014-03-14 42 views
0

對於我用PHP編寫的新網站,我打算定期測試用戶密碼的漏洞。我主要關心的是是否可以使用強力攻擊(例如字典攻擊)。執行計劃字典攻擊測試用戶羣

我目前的設計是使用一個安全腳本,對許多用戶執行字典攻擊。在腳本確定密碼可以被黑客入侵之後,我想發送一封郵件給用戶,我們強烈建議他們改進密碼。郵件,腳本等部分很容易。然而,有人可以給我指針如何實現這個字典「攻擊」?

我真的很感謝您能提供任何幫助。

編輯:我實際上感興趣的是當「黑客」試圖通過正常的登錄表單進入網站。

我目前的對策已經是:在當前數據庫中,所有密碼都使用BCrypt進行加密,我使用準備好的語句來防止SQL注入,當一個IP地址試圖嘗試太多次時會暫時鎖定(5分鐘),以及儘量防止XSS。

但是,當我認爲他的密碼不安全時,我仍然想警告用戶,不要將他關閉,如果他想繼續使用此密碼,他的選擇仍然取決於他。

+1

您寧願保護您的系統免受此類攻擊(儘可能多)。我想到的第一件事就是限制嘗試的次數,並增加用戶在嘗試和/或使用驗證碼(或者只是阻止任何嘗試)之間等待達到特定閾值時必須等待的時間。如果你瀏覽一些相關的問題,我相信你會在這裏找到更多的信息。 – Brice

回答

0

儘管首先要保護網站免受暴力攻擊(鎖定)至關重要,但字典測試實際上相當不錯,並且可以通過通知用戶使用弱密碼來幫助用戶。

另一個可能發生的爭論是不允許用戶使用弱密碼進行註冊。如果你選擇這種方法,那麼我就是你自己正在做的一切,並且整個互聯網都是一種幫助。標準用戶會反駁這一點,並且存在潛在的用戶/客戶流失。

令人沮喪的是大多數人會忽略它,但有些人會聽。安美居。下來代碼:)

因此,首先建立您的密碼列表,它不需要一個天才谷歌一個。我們會假設list.txt是您的密碼列表。

已編輯:實施了各種規則來從傳遞的字符串生成密碼,以便即使我們只有相對較弱的密碼列表,我們也可以返回它的多個版本。

$users = array(); // Fill it via any means you want, we will 
        // pretend its an array of username + password 

foreach($users as $user) { 
    // We are going to loop through each line in the list and 
    // then check it against the password 
    while($line = fread('list.txt')) { 
     $hashes = $this->hashPassword($line); 
     foreach($hashes as $hash) { 
      if($user['password'] == $hashedPassword) { 
       echo $user['username'] . ' has a weak password of ' . $line . '<br>'; 
      } 
     } 
    } 
} 

function hashPassword($password) { 
    $simple = hash('sha256', $password); 
    $numberReplace = hash('sha256', str_replace(array("o", "i", a"), array(0, 1, 4), $password)); 
    $stupidUserPassword = hash('sha256', ucfirst($password) . "1"); 

    return array($simple, $numberReplace, $stupidUserPassword); 
} 

這只是一個例子,所以看看其他一些答案也可能有所幫助。有任何問題請隨時詢問我(們)。編輯1:真棒評論員發現了我的邏輯缺陷,這是一個相當可怕的缺陷 - 歡呼聲。

編輯2:谷歌彩虹表,以及如何爲您的特定需求生成。預散列表,加速執行,如果你真的硬核它:)

+0

我想有些東西不是嚴格的SOX,但是要有禮貌,不要反覆通知他們弱密碼也會被建議。 –

+0

如果密碼正確醃製,此方法將不起作用。醃製是爲了防止這種徹底的攻擊。您需要遍歷每個用戶,然後遍歷每個字典條目。 – PaulG

+0

@PaulG歡呼,以便發現。 Tbh我很驚訝,我沒有注意到這一點。 –

0

它是最簡單的形式,你可以比較純文本密碼(你只有在用戶註冊時)與每一行在字典中。我認爲這種方法很簡單,不需要代碼示例。

但是,您擔心這一點的事實表明您可能會錯誤地實現哈希。

您應該爲每個散列生成一個獨特的salt,並將其用作密碼的前綴。這種鹽增加了密碼的強度,否則它會變弱,因此意味着字典搜索毫無意義。

加入鹽的後果意味着任何攻擊者一次只能攻擊一個密碼(並且需要知道獨特的鹽)。它基本上擊敗了攻擊者不知道鹽的暴力攻擊。並從根本上減緩了攻擊者的攻擊行爲確實知道鹽

+0

我確實使用了獨特的鹽,密碼和用戶名的組合,這本身就會使得哈希「不可能」破解,因此數據庫是安全的。此外,後端會在嘗試多次後轉儲連接。但是,可以說,一個僵屍網絡被用來攻擊他們知道電子郵件的常規登錄。對於這些情況,我想確保密碼本身不能被提示,例如字典攻擊。 –