一遍又一遍地散列最終會給出相同的散列嗎?
在數學中有很多情況下,一遍又一遍地做同樣的事情會讓你更接近一個價值。多項式的推導就是一個突出的例子:無論你從什麼開始,你都會以 0 結束。在級數展開中,你繼續序列的時間越長,你就越接近真實值。
這個概念適用於數學以外的領域(例如,維基百科的一切都導致哲學現象)。這有點無關,但它只是證明了這個概念。
散列算法只是特殊的數學。從邏輯上講,散列熵應該會隨著散列值的增加而減少。那麼是否存在任何輸入值將給出與任何其他值相同的雜湊值的點?
(讓我明確指出,我們不會在每次散列時重新註入任何新數據,就好像我們試圖通過加鹽和重新散列來增加散列的安全性一樣。這完全是 md5(md5( md5(… 如果這是我們正在使用的算法。
我已經看到了一些問題。像 md5 這樣的算法旨在當輸入僅改變一位資訊時徹底改變其輸出。因此,即使在此過程中出現了兩個值的公共散列,它本身也會開始改變。但是,輸出看起來非常不同的事實是否實際上意味著可能性仍然很多?
一般來說,散列函式中的衝突是一件壞事:如果你有不同的 $ M_1 $ 和 $ M_2 $ 為此 $ hash(M_1)=hash(M_2) $ ,這種情況需要特殊處理。
在密碼學中,散列函式可以看作是“匯總”函式,它將任意長度的消息減少為固定長度的消息。由於消息空間(所有可能的消息)通常比散列空間(所有可能的散列)大得多,因此必然會發生衝突。
攻擊者有幾種方法可以破壞雜湊函式,但是對於這種情況,讓我們取一個隨機值 $ H_1 $ 在雜湊空間中。例如,它可能是您從伺服器檢索到的散列密碼。重要的是它是固定的。
在大多數情況下,就像散列密碼一樣,攻擊者不需要知道原始密碼。他只需要知道一個隨機密碼 $ P $ 這樣 $ hash(P)=H_1 $ . 這絕對是不可取的,這就是為什麼密碼散列函式被設計為抗衝突的原因。這意味著,對於使用最有效的多項式算法來攻擊雜湊函式的攻擊者來說,需要很長時間(比人類存在時間更長的時間)才能找到碰撞。
說了這麼多,你想找到的是一些 $ M $ 為此 $ H(H(H(…H(m)…))) $ 幾次,再次給予 $ H(M) $ . 這在數學上是可能的(並且肯定會獲得),但您的血統可能不會活著看到它。
最後一點:密碼範例顯然存在缺陷,因為針對它的攻擊更具體(如字典攻擊和彩虹表),但對於您的場景來說已經足夠了。