2011-04-24 91 views
7

功能是:

$a == md5($b . $secret); 
  • 你可以選擇一個$和$ b
  • 你不知道的祕密$
  • 您可以爲您選擇的$ a和$ b函數的值爲true或false。

有沒有更好的攻擊比蠻力找到一般的$祕密? 使用PHP's md5 function有沒有比蠻力找到$ secret更好的攻擊?

從我在網上找到的東西我認爲沒有,雖然md5已被棄用一些其他用例。因此,只要是的......

親切的問候

回答

3

如果MD5的行爲像一個隨機預言(這是一個很大的「如果」,見下文),那麼在$secret上的詳盡搜索是最好的攻擊 - 更重要的是,每個「猜測」$secret的值必須對函數使用查詢(因爲您使用PHP,我假設該函數在Web服務器中實現,並且每個「查詢」需要與該服務器交談)。後者的缺點是缺乏發送給攻擊者的信息:攻擊者除了單一位之外沒有任何東西(「True」或「False」的結果)。特別是,他本身並沒有獲得MD5輸出。攻擊者會得到很長的信息流的「False」結果,除非他碰到了正確的MD5輸出,要麼出於純粹的機會(概率2 -128,這是真的很小),或者因爲他正確猜測了值$secret預先。值得注意的是,這可以防止攻擊者使用許多成本分攤技術,包括預先計算的表格,特別是過度炒作的rainbow tables

一個random oracle是可以被看作是一個確定性的黑盒子一個神祕的對象:你知道的輸出,你會從給定輸入獲得什麼,除了框會一直返回相同的結果對於一個給定的輸入。一個模型如下:該框包含一個侏儒,一些骰子和一本大書。侏儒使用骰子隨機選擇輸出。他還使用本書來追蹤他已發送的答案,以便保持一致,即如果輸入與先前提交的輸入相同,則gnome將返回與先前相同的輸出,而不是擲骰子。

然而,MD5是而不是的隨機預言。例如,對於具有128位輸出的函數,我們可以爲MD5構建碰撞比理論上的阻抗快得多。另外,請注意,作爲一個好的散列函數(抗碰撞等)並不是絕對需要「隨機預言」。例如,SHA-256被認爲是一個安全的散列函數,雖然它仍然遭受所謂的「長度擴展攻擊」(給定SHA256($a),人們可以計算SHA256($a . $b)而不知道$a,對於幾乎任意值$b)。所以隨機預言的保證不適用於MD5(或者就此而言,SHA-256)。這並不意味着更快的攻擊是已知的!只有你自己在這裏。

還可以指出,md5($b . $secret)是一種「密鑰散列」,即MAC(消息認證碼)。從哈希函數中構建一個MAC並不容易,正是因爲諸如長度擴展攻擊(例如,md5($secret . $b),將是一個非常差的MAC)。已經設計了一個用散列函數構建MAC的穩健方法;它被稱爲HMAC並涉及底層哈希函數的兩個調用(但其中一個是短輸入,所以這是有效的)。 HMAC的安全性,更確切地說HMAC如何被認爲是隨機預言,可以被「證明」,即減少到一些哈希函數內部屬性,在SHA-256的情況下被認爲是真實的(參見Mihir Bellare的New Proofs for NMAC and HMAC: Security without Collision-Resistance血淋淋的細節)。通過使用超過$b的HMAC/SHA-256,以$secret爲關鍵,您將從這些安全結果中受益,並且您的構建將更具有說服力。再說一遍,我並不是說在md5($b . $secret)上有一個已知的攻擊,只是使用MD5 自制的MAC結構會引起紅旗,這會降低可以賦予這種系統的信任級別。

1

下載著名密碼的彩虹表/密碼哈希! :)

+1

這幾乎是唯一的選擇,除了蠻力攻擊。應該考慮到,現在md5哈希值可以很快計算出來,因此這種蠻力攻擊不應該被低估。Bcrypt或Blowfish似乎是由真正的加密/安全專家推薦的算法(因爲它們在加密方面更加安全並且可以減慢任意數量)。 – 2011-04-24 02:33:25

+1

彩虹表不會工作,因爲鹽(除非鹽長度+密碼長度小於8,這是不太可能的)。你需要暴力破解,這需要很長時間。 – Ben 2011-04-24 02:43:09

+0

,但如果你運氣足以得到相同的鹽:) – Sourav 2011-04-24 02:45:13

3

這是一個有趣的問題,因爲在IT安全的典型場景中,您不能選擇$a$b作爲攻擊者。例如,如果您能夠獲得散列密碼,則已經定義了$a$b,您必須使用該密碼。在這種情況下,如果有鹽$b可用,您只能使用蠻力或彩虹表。

另一方面,在您的示例中,您可以自由選擇兩個值。你可以採取任意的祕密,例如test並相應地選擇$a$b的值。我選擇$ b作爲empty string並用$a = md5($secret)計算$a,結果爲098f6bcd4621d373cade4e832627b4f6

我選擇$a = "098f6bcd4621d373cade4e832627b4f6"$b= ""並詢問您是否$secret == "test"。你說的是真的,我說問題解決了。

這最終導致我們真正的答案。這兩個條件給予

  • 你可以選擇一個$和$ b
  • 你不知道的祕密$

不在一起工作。在我的例子中,我自己定義了$secret。我違反了第二個條件。另一方面,我不能從$secret中任意選擇$a$b,因爲他們可能沒有解決方案。

如果我們假設至少有一種解決方案適用於所有可能的$a$b(也許有證據表明我不知道),並且您選擇它們​​的方式是您真的不知道的我總是想定義$b = "",使攻擊儘可能簡單。在這種情況下,彩虹桌是你的朋友。