重新散列雜湊後失去熵
假設您有一個
AAA
使用 SHA1 散列的字元串來生成606ec6e9bd8a8ff2ad14e5fade3f264471e82251
.如果我
606ec6e9bd8a8ff2ad14e5fade3f264471e82251
用相同的 SHA1 算法重新雜湊 10 次,熵會繼續減少嗎?如果是這樣,它是否會達到
AAA
可以恢復的危險程度?PS:SHA1 只是一個例子。理想情況下,我會使用 BLAKE2b 或 SHA3 候選者。
讓我們假設您的實際輸入/輸出具有熵(對於給定的字元串或輸出雜湊值沒有熵)。
如果我
606ec6e9bd8a8ff2ad14e5fade3f264471e82251
用相同的 SHA1 算法重新雜湊 10 次,熵會繼續減少嗎?是的,但數量很少。雜湊的設計使得每一位都依賴於輸入的所有位。經過多次迭代後,雜湊確實進入了所謂的循環,這表明熵可以而且確實會減少。然而,它不太可能影響實際情況。
初始雜湊當然會將熵提取到最大略小於 160 位。
如果是這樣,它是否會達到可以恢復 AAA 的危險水平?
這當然是胡說八道;熵的數量根本不影響密碼散列函式的單向函式屬性。
讓我們採取一個極端的假設,一段時間後,所有許多消息都將生成相同的散列(這本身就是幾乎不可能的情況)。然後(香農)熵將降低。所以在這種情況下,它更有可能通過嘗試不同的消息來生成這個迭代的雜湊。
但是,如果您嘗試還原它,您會發現許多消息而不是一條,並且無法檢測出哪一條是原始輸入消息。所以如果有的話,你只是讓函式更難反轉。
例如:我通過對它們進行異或運算,將完全隨機消息的所有位“散列”成一個位。熵被極大地降低到一個比特的價值。我使用哪條消息來創建這一點熵,即使您(開始)知道它是
0
或1
?
熵一般不會改變。這是生成 10 sha1 雜湊併計算熵的 python 腳本的輸出
('606ec6e9bd8a8ff2ad14e5fade3f264471e82251', 3.787326145256008) ('872e371675df9bf6d8d510a768bd8c111107d4e7', 3.6873261452560073) ('e58e33b305a4d5637d1bcbf786875596d7f62fe0', 3.787326145256008) ('725732757ca3402ac5c62001bf377471e7c9580d', 3.6530559073332753) ('d74c173a570b676792e7f569ffc3bf8068bd9c30', 3.7898227820087547) ('93fce9149cee02f918ff1211bfbd196566147acb', 3.6746702095890935) ('27e3fc35e4c17c7a4f1c687d995a034ec368d95c', 3.758694969562841) ('8085ea82b4d2898cfb92431d64a6c60c3a2673d8', 3.7898227820087547) ('160f9cd062a925d068304d37b4b85108762b34a1', 3.7995817701478343) ('61352724fe0931447d6a0b6ebb4f0843b84aab5f', 3.7495817701478344)
請記住,我從其他文章中複製了熵函式,並且可能因實現而異。