功能是:
$a == md5($b . $secret);
- 你可以選擇一個$和$ b
- 你不知道的祕密$
- 您可以爲您選擇的$ a和$ b函數的值爲true或false。
有沒有更好的攻擊比蠻力找到一般的$祕密? 使用PHP's md5 function有沒有比蠻力找到$ secret更好的攻擊?
從我在網上找到的東西我認爲沒有,雖然md5已被棄用一些其他用例。因此,只要是的......
親切的問候
功能是:
$a == md5($b . $secret);
有沒有更好的攻擊比蠻力找到一般的$祕密? 使用PHP's md5 function有沒有比蠻力找到$ secret更好的攻擊?
從我在網上找到的東西我認爲沒有,雖然md5已被棄用一些其他用例。因此,只要是的......
親切的問候
如果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結構會引起紅旗,這會降低可以賦予這種系統的信任級別。
下載著名密碼的彩虹表/密碼哈希! :)
這是一個有趣的問題,因爲在IT安全的典型場景中,您不能選擇$a
和$b
作爲攻擊者。例如,如果您能夠獲得散列密碼,則已經定義了$a
和$b
,您必須使用該密碼。在這種情況下,如果有鹽$b
可用,您只能使用蠻力或彩虹表。
另一方面,在您的示例中,您可以自由選擇兩個值。你可以採取任意的祕密,例如test
並相應地選擇$a
和$b
的值。我選擇$ b作爲empty string
並用$a = md5($secret)
計算$a
,結果爲098f6bcd4621d373cade4e832627b4f6
。
我選擇$a = "098f6bcd4621d373cade4e832627b4f6"
和$b= ""
並詢問您是否$secret == "test"
。你說的是真的,我說問題解決了。
這最終導致我們真正的答案。這兩個條件給予
不在一起工作。在我的例子中,我自己定義了$secret
。我違反了第二個條件。另一方面,我不能從$secret
中任意選擇$a
和$b
,因爲他們可能沒有解決方案。
如果我們假設至少有一種解決方案適用於所有可能的$a
和$b
(也許有證據表明我不知道),並且您選擇它們的方式是您真的不知道的我總是想定義$b = ""
,使攻擊儘可能簡單。在這種情況下,彩虹桌是你的朋友。
這幾乎是唯一的選擇,除了蠻力攻擊。應該考慮到,現在md5哈希值可以很快計算出來,因此這種蠻力攻擊不應該被低估。Bcrypt或Blowfish似乎是由真正的加密/安全專家推薦的算法(因爲它們在加密方面更加安全並且可以減慢任意數量)。 – 2011-04-24 02:33:25
彩虹表不會工作,因爲鹽(除非鹽長度+密碼長度小於8,這是不太可能的)。你需要暴力破解,這需要很長時間。 – Ben 2011-04-24 02:43:09
,但如果你運氣足以得到相同的鹽:) – Sourav 2011-04-24 02:45:13