既然我們已經有了 SHA-384,為什麼還要 SHA-512/256?
它們都只是具有不同 IV 和截斷的 SHA-512。擁有2個有什麼意義?(實際上我們有 3 個,因為 SHA-512/224 是完全相同的。)
SHA2 的截斷版本是在 2005 年引入的,在 2005 年的 Cryptographic hash Workshop 中,Kelsey列出了原因:
互操作性和安全原因
需要直接替換 SHA1 (MD5)
具有錯誤大小的完整雜湊
- ECDSA/DSA 密鑰大小
- 文件和協議格式
雖然 Kelsey 或任何其他 NIST 文件都沒有提到,但截斷也有助於減輕由於Merkle-Damgård 構造的SHA 系列的長度擴展攻擊架構問題。
使用不同的 IV 可以實現域分離,使我們能夠擁有兩個不同的隨機預言機*。它確保截斷的版本具有不同的結果。與域分離 $$ \operatorname{SHA-224}(m) \neq \operatorname{SHA-256}(m)|{224} $$在哪裡 $ |{224} $ 是截斷
擁有2個有什麼意義
- 如果你已經有一個使用 SHA-256 的實現並且你想減輕長度擴展攻擊,那麼 SHA512/256 是一個不錯的選擇。此外,它可能會增加攻擊強度。
- 此外,當您只需要 256 但雜湊輸出時,如果您使用 SHA512/384,則需要自己修剪。在程式和安全性的情況下不是一個好主意,因為您使用的是相同的隨機預言機。
- ECDSA/DSA 密鑰大小:ECDSA-384 簽名 SHA512/384 是一個不錯的選擇,尤其是對於 64 位設備,因為 SHA512 是為 64 位設計的。
- 有人嘗試使用 SHA512 並遇到 TLS 1.2 問題。如果您採用 ECDSA-384 簽名 SHA512/384 是一個不錯的選擇,如上所述。
- 對於 SHA512/224 和簡單的 224 位使用是由於 Triple-DES 安全性, $ 112 \cdot 2 = 224 $ . Frieu SHA-224 Purpose對此有一個非常廣泛的答案。
*隨機預言機就像一種散列函式,同樣的概念也適用於散列函式。
SHA-512 在 64 位系統上可能比 SHA-256 更快(即使用更少的 CPU 週期),因為它使用 64 位字長而不是 SHA-256 使用的 32 位字長。因此,它每字節使用的輪數減少了大約三分之一。
請注意,如今 SHA-256 可以由Intel 的 SHA-extensions(也可以在 AMD CPU 上實現)支持,這可能會將優勢交還給 SHA-256。還要注意,SHA-512 變體也有更大的塊大小,所以我猜 SHA-256 變體對於小消息仍然可能更快——即使沒有 CPU 支持。
除了輸出大小之外,SHA-256 和 SHA-512 的混合功能有些不同,如果只是為了不同的字長。不過,算法構造或多或少是相同的,具有相同的底層安全功能。不過,這兩種雜湊都被認為是安全的,因此尚不清楚 SHA-512 算法是否比 SHA-256 增加了很多安全性(如果有的話)。
擁有一個具有不同初始化向量的實現當然也可以減少程式碼大小,儘管值得懷疑的是,為什麼任何大小受限的系統首先會選擇使用 SHA-512 變體。
安全方面,防止長度擴展攻擊的保護 - 如另一個答案中所述- 也可能發揮作用。這是特定於鍵控散列函式的(或者更準確地說,是從未知數據上的已知散列值創建散列值)。請注意,HMAC 已經提供了對長度擴展攻擊的抵抗力,這就是為什麼我不認為它是主要問題。
相當多的庫不支持 SHA-512/256 和 /224 變體。老實說,除了輕微的性能優勢之外,我沒有看到太多的案例。我沒有看到很多協議指定它們,並且對這些變體的了解似乎有限。