2012-04-13 153 views
1

我正在使用moodle系統,但事實證明它使用md5鹽哈希。我發現了一些來,所以也許你可以解釋它給我,因爲我只有PHP的基本知識。php代碼md5哈希解釋

function validate_internal_user_password($user, $password) { 
global $CFG; 

if (!isset($CFG->passwordsaltmain)) { 
    $CFG->passwordsaltmain = ''; 
} 

$validated = false; 

if ($user->password === 'not cached') { 
    // internal password is not used at all, it can not validate 

} else if ($user->password === md5($password.$CFG->passwordsaltmain) 
     or $user->password === md5($password) 
     or $user->password === md5(addslashes($password).$CFG->passwordsaltmain) 
     or $user->password === md5(addslashes($password))) { 
    // note: we are intentionally using the addslashes() here because we 
    //  need to accept old password hashes of passwords with magic quotes 
    $validated = true; 

} else { 
    for ($i=1; $i<=20; $i++) { //20 alternative salts should be enough, right? 
     $alt = 'passwordsaltalt'.$i; 
     if (!empty($CFG->$alt)) { 
      if ($user->password === md5($password.$CFG->$alt) or $user->password === md5(addslashes($password).$CFG->$alt)) { 
       $validated = true; 
       break; 
      } 
     } 
    } 
} 

if ($validated) { 
    // force update of password hash using latest main password salt and encoding if needed 
    update_internal_user_password($user, $password); 
} 

return $validated; 

}

難道是很難改變它在進入簡單的文本後,將成爲哈希?

+1

你的問題就沒有意義了。完全不清楚你想要做什麼。 – ceejayoz 2012-04-13 19:19:01

+0

我正在創建一個java應用程序,它將連接到數據庫並從中獲取數據,但存在問題。使用網頁註冊的帳戶密碼已變更。上面的代碼應該是它如何改變的方式。但我不明白,我想如果有人可以給我解釋 – LTnewbie 2012-04-13 19:24:11

+1

使用Moodle的網絡服務API。不要直接使用數據庫。 Moodle已經破碎了,因爲它不會讓事情變得更糟。 – Brad 2012-04-13 19:31:09

回答

1

這是一個密碼驗證,其中包含一些舊密碼。

有5所形成密碼它將允許:

  • MD5(密碼)
  • MD5(和addslashes(密碼))
  • MD5(密碼+通用鹽)
  • MD5(addslashed )+通用鹽)
  • MD5(密碼+ saltX)

第一件事首先,什麼是MD5? md5是「消息摘要5」。長話短說它是一個將字符串轉換爲32個字符的字符串的函數,調用hashhash的主要特性是很難(如計算困難)得到原始字符串。存儲密碼的理想選擇,對吧? :)

但僅靠密碼是不夠的。想象一下你的密碼是「龍」(非常糟糕的密碼btw)。如果你碰巧知道md5中的「dragon」是「8621ffdbc5698829397d97767ac13db3」,那麼只需查看hash即可知道密碼。所以你添加了所謂的「鹽」。這只是在散列之前添加密碼的另一個詞。

如果你的鹽是「notsob1gs3cret」密碼本質上是「dragonnotsob1gs3cret」這會導致:「c47948e6b966357f1b9a3732c4ee7c72」,這看起來並不像什麼「8621ffdbc5698829397d97767ac13db3」。這是散列的另一個屬性,類似的輸入應該產生完全不相似的輸出,足以和任何隨機詞幾乎相似。

如果你的攻擊者從來沒有見過鹽「notsob1gs3cret」,那麼他就不會那麼容易猜出原來的密碼。

關於你的代碼。忽略addslashes,這可能來自一些傳統的bug。它看起來像有人試圖在稍後添加salting機制,並仍然希望所有舊密碼都能正常工作,但看起來有點笨拙。理想情況下,您只能擁有一個有效的密碼機制並升級較弱的安全性。

有20種不同的鹽,這是一個公平的想法,我想..但代碼似乎並不知道哪一個被使用..所以它嘗試所有這些?這很奇怪,可能是不安全的。

哈希一些文字只是做:

$text = "a bit of text"; 
var_dump(md5($text)); 
+0

如何知道使用什麼鹽字? – LTnewbie 2012-04-13 19:33:17

+0

這是他不知道的一點,他只是嘗試所有這些。當然,一旦你找到了一場比賽,你就會知道使用了哪一場,但那也需要一個有效的密碼。 – Halcyon 2012-04-13 19:34:08

+0

非常有用,謝謝。 – Norse 2012-04-13 19:48:04