Hash

將 SHA512 雜湊截斷到前 160 位是否與使用 SHA1 一樣安全?

  • November 26, 2018

我來自網路開發背景(我不太了解密碼學或算法本身的工作原理),所以我用簡單的術語問這個問題。

考慮使用 SHA1 對單詞“test”的雜湊:

a94a8fe5ccb19ba61c4c0873d391e987982fbbd3

如果我改用 SHA512,然後只需獲取輸出的前 40 個字元:

ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff

ee26b0dd4af7e749aa1a8ee3c10ae9923f618980

問題

  1. 像這樣散列和儲存敏感數據是否有任何安全隱患?
  2. 它比使用完整的 SHA1 雜湊更安全還是更安全?
  3. 使用截斷版本時是否會增加雜湊衝突的風險?

這是由有人這樣做引發的爭論,他們的原因是使用 SHA512 版本會更好,因為它是一種更安全的算法,並且通過截斷它,潛在的黑客將不知道在第一名。

我的理解是 SHA1 總是會產生一個唯一的值,而 SHA512 輸出的前 40 個字元可能會出現多次。

作為一般規則,您不應該使用 SHA1;相反,請使用 SHA-2 系列的雜湊函式之一。

就截斷雜湊而言,這很好。它得到 NIST 的明確認可,並且 SHA-2 系列中的雜湊函式是其完整兄弟的簡單截斷變體:SHA-256/224、SHA-512/224、SHA-512/256 和 SHA-512 /384,其中 SHA- $ x $ / $ y $ 表示全長SHA- $ x $ 截斷為 $ y $ 位。(從技術上講,截斷版本的起始算法常數是不同的,正如 Henno Brandsma 所指出的,但這與我試圖提出的觀點有些正交。)

像這樣散列和儲存敏感數據是否有任何安全隱患?

就從摘要本身確定敏感材料而言,您是安全的。所有安全的現代密碼散列都具有所謂的原像抗性,這本質上意味著如果你願意的話,在計算上“反轉”散列是不可行的。因此,您的敏感數據的機密性不會因儲存摘要而受到損害。(注意:請參閱下面 Gordon Davisson 對此的評論;在某些情況下可能存在安全隱患。)

現在,真正的問題是:為什麼要首先儲存散列?希望您沒有使用它來檢測數據是否被惡意修改;這通常是MAC的權限,例如HMACCBC-MAC

它比使用完整的 SHA1 雜湊更安全還是更安全?

實際上,如果您關心抗碰撞性,則安全得多。對SHA1 的攻擊可以在 2 60時間內找到衝突,而將 SHA-512 截斷為 160 位需要 2 80時間才能找到衝突(請參閱生日攻擊)。因此,在抗碰撞性方面,將 SHA-2 函式之一截斷為 160 位大約要強2 20倍。(另外,發現衝突現在在 SHA1 的可能性範圍內。因此,如果您正在閱讀本文,並且您正在建構一個新系統,您應該選擇 SHA-2 或 SHA-3。)

使用截斷版本時是否會增加雜湊衝突的風險?

SHA1 風險增加?不會。使用完整的 SHA-512 輸出會增加風險嗎?是的。

截斷散列函式的輸出總是會降低其(理論上的)抗碰撞性。在實踐中,它通常並不重要。例如,2 80時間仍然很大。儘管如此,如果您使用 SHA-256 的完整輸出,同樣的生日攻擊將需要2128次,這完全是遙不可及的。

通過截斷它,潛在的黑客首先不會知道使用了哪種算法

總是假設攻擊者知道你的算法/加密系統的一切,除了密鑰。這被稱為Kerckhoffs 原理。為什麼這很重要所以你應該遵循它。

我的理解是 SHA1 總是會產生一個唯一的值,而 SHA512 輸出的前 40 個字元可能會出現多次。

SHA1 不會產生唯一值。SHA1 有無限多可能的輸入(它需要一個任意長度的位串),但輸出只有 160 位。根據鴿巢原理,必須有無限多個值映射到相同的 160 位輸出。2017 年 2 月,發布了 SHA-1 碰撞。然而,迄今為止還沒有任何公開的 SHA-256 衝突,儘管鴿巢原則保證它們存在。


我應該注意,如果您要使用 SHA1、SHA-256 或 SHA-512 的完整輸出,您應該注意長度擴展攻擊

引用自:https://crypto.stackexchange.com/questions/9435