2012-08-22 505 views
0

這是理論問題,但我很好奇。如果我(在PHP代碼,但語言是不是真正的問題在這種情況下)這樣做:散列的md5散列

$value = ''; //starting value 
$repeat = false; 

while(true) 
{ 

    $value = md5($value); 

    /*Save values in database, one row per value*/ 

    /*Check for repeated hash value in db, and set $repeat flag true if there is one*/ 

    if($repeat)break;  
} 

正如你可以看到我懷疑還會有反覆的哈希值。我認爲現在的每一個文本都沒有自己的價值,因爲它應該意味着每一個散列值都有它自己的含義,這是沒有意義的。

我的問題是:是否有任何一篇關於這個「問題」了嗎?它可能發生我在一個系統中獲得相同的值,例如當我散列文件檢查它們是否有效時?這會在任何系統的任何地方造成問題嗎?

+1

由於碰撞和速度,md5完全破碎。至少如果你使用它來進行密碼散列,或者你試圖「保護」其他東西。 – PeeHaa

+3

http://en.wikipedia.org/wiki/MD5#Collision_vulnerabilities – PeeHaa

+0

這是有點不清楚你想要做什麼。你爲什麼在這樣的鏈條中散列?在你使用的一個部分使用這個鏈,在另一部分你討論文件哈希。這些是完全不同的情況。 – CodesInChaos

回答

3

如果你關心多個文本散列爲相同的值,不要使用MD5。 MD5具有快速碰撞攻擊,這違反了你想要的財產。改用SHA-2。

當使用安全散列函數,用於128個散列碰撞是很難找到,並通過我的意思是我不知道的情況下它發生的。但是如果你想避免這種機會,只需使用256位散列。然後使用蠻力來發現碰撞超出了現在所有人類的計算能力。特別是沒有已知的消息對,其中SHA-256(m1) == SHA-256(m2)m1 != m2

你說得對,哈希不能是唯一的(見Pidgeonhole principle),但是你真正找到這樣的情況下,機會是非常低的。所以,不要爲處理這種情況而煩惱。

我通常瞄準128位的安全級別,所以當我需要一個無碰撞散列函數,我使用256位的散列函數,如SHA-256。


有了您的哈希鏈,你不會找到一個碰撞,除非你願意等待時間。一旦有大約2 ^(n/2)次,碰撞就很可能發生,在128位散列(如md5)的情況下爲2^64。我知道沒有對128位散列的蠻力衝突。我所知道的唯一衝突是精心製作的消息,它利用您使用的散列方案中的弱點(針對md5存在的)。

+0

謝謝。我接受這一點是因爲它指向了皮丁洞原理。而且非常翔實的答案。當然,我知道我無法通過這個小代碼找到碰撞,我只是爲了說明而編寫的。 (老實說,當我開始學習編程時,我想了很多,但現在它又出現了,想從腦海中清除這些東西......並且我也學到了一些新東西:)) –

+0

應該是「使用scrypt/pkdf2」。 –

+0

@BillyONeal爲什麼?我沒有看到任何跡象表明OP需要加強關鍵。 – CodesInChaos

-3

哈希它多次用同樣的方法或不同的方法,那麼這將是幾乎不可能重複自身,還要檢查是否重複再重複的散列函數,直到值是不同的,然後保存在數據庫或者用它在那裏永遠你喜歡...

+0

完全錯誤。如果哈希中的壓縮函數容易受到攻擊(這就是在MD5情況下以及SHA-1和SHA-2類似哈希中容易受到哈希攻擊的原因),那麼多次運行相同的哈希將不會提供額外的保護。此外,如果第一個散列值相同,則再次散列它將產生第二個散列值,這實際上是相同的。 –

+0

沒有它不是,例如: 哈希這個「名」,您將獲得「b068931cc450442b63f5b3d276ea4297」, 現在湊這個結果「b068931cc450442b63f5b3d276ea4297」,您將獲得「eb8342ec6933b9dc8e9fe7e86d476f21」 < - 那麼,他們是絕對不一樣的,你可以請參閱,這適用於MD5和SHA-1等。 – devWaleed

+0

如果我可以找到第一個散列「b068931cc450442b63f5b3d276ea4297」的衝突,它可能是也可能不是「名稱」,然後再次散列它不會改變任何東西。第一個散列已經產生了相同的輸出。對於導致首次碰撞的兩個輸入,MD5的第二階段將生成「eb8342ec6933b9dc8e9fe7e86d476f21」。 –