我對SHA-2和SHA-256之間的區別感到困惑,經常聽到它們可以互換使用。我認爲SHA-2是散列算法的「家族」,而SHA-256是該家族中的一種特定算法。任何人都可以清除混淆。「SHA-2」和「SHA-256」之間的區別是什麼
回答
SHA-2家族由多個密切相關的散列函數組成。它基本上是一個單一的算法,其中一些變量中的一些次要參數是不同的。
初始規格只包含224,256,384和512位變體。
變體之間最顯着的區別是有些是32位變體,有些是64位變體。在表現方面,這是唯一重要的區別。
對於32位CPU,SHA-224和SHA-256比其他變體快很多,因爲它們是SHA-2系列中唯一的32位變體。由於在32位CPU上執行64位操作增加了複雜性,因此在32位CPU上執行64位變量將會很慢。
在64位的CPU上,SHA-224和SHA-256的速度會比其他版本慢一點。這是因爲由於一次僅處理32位,所以爲了使其通過相同數量的字節,它們將不得不執行更多的操作。由於64位變量比32位變量具有更多的循環次數,因此從切換到64位變量的速度並沒有增加一倍。
對於兩個32位變體,內部狀態的大小爲256位,對於所有四個64位變體,其內部狀態的大小爲512位。因此,內部狀態的可能尺寸數量少於最終輸出的可能尺寸數量。取決於你的觀點,從大的內部狀態到較小的輸出可以是好的還是壞的。
如果保持固定的輸出大小,通常可以預期增加內部狀態的大小將提高安全性。如果保持固定內部狀態的大小並減小輸出的大小,碰撞變得更可能,但長度擴展攻擊可能變得更容易。使輸出尺寸大於內部狀態將是毫無意義的。由於64位變體的速度更快(在64位CPU上),並且可能更安全(由於內部狀態更大),因此使用64位字但輸出更短的兩個新變體被引入。那些被稱爲512/224和512/256。
想要輸出比內部狀態短得多的變體的原因通常是對於某些用法來說,使用如此長的輸出是不切實際的,或者需要將輸出用作某些算法的關鍵點,輸入一定大小。
簡單地將最終輸出截斷爲所需的長度也是可能的。例如,HMAC構造指定將最終散列輸出截斷爲所需的MAC長度。由於HMAC將一次散列調用的輸出提供給另一次調用,這意味着使用輸出較短的散列會導致內部狀態較少的HMAC。由於這個原因,使用HMAC-SHA-512並將輸出截斷爲384位比使用HMAC-SHA-384可能稍微安全一些。
SHA-2的最終輸出只是內部狀態(在處理長度擴展輸入之後)被截斷爲所需數量的輸出位。 SHA-384和SHA-512在同一輸入上看起來如此不同的原因是,爲每個變體指定了不同的IV。
百科:
的SHA-2家族包括六個散列函數與該是224,256,384或512位的摘要(哈希 值):SHA-224,SHA-256,SHA- 384, SHA-512,SHA-512/224,SHA-512/256。
- 1. RSAwithSHA256和SHA256之間的區別
- 2. $(())和expr之間的區別是什麼?
- 3. $和$ .fn之間的區別是什麼?
- 4. ++和:haskell之間的區別是什麼?
- 5. $(「」)和$ .find(「」)之間的區別是什麼?
- 6. 「\」和「\。」之間的區別是什麼?
- 7. 「$ | ++」和「$ | = 1」之間的區別是什麼
- 8. $(...)和`...`之間的區別是什麼
- 9. .equals()和==之間的區別是什麼?
- 10. [undefined]和[,]之間的區別是什麼?
- 11. 區別:%% a和%variable%變量之間的區別是什麼?
- 12. 什麼是爲PrintWriter和DataOutputStream之間的區別是什麼?
- 13. MVC和MVVM之間的區別和相似之處是什麼?
- 14. TVF/UDF之間的區別是什麼
- 15. [EmailPasswordAuthProvider,EmailAuthProvider]之間的區別是什麼
- 16. System.Linq.Enumerable.WhereListIterator&System.Linq.Enumerable.WhereSelectListIterator之間的區別是什麼?
- 17. 什麼之間的區別〜^和Git中
- 18. 什麼@android之間的區別:和android:
- 19. Ruby和SHA256 - MacOS和Windows之間的區別?
- 20. 什麼是SetupAPI,SetupAPI1和SetupAPI2?他們之間有什麼區別?
- 21. lock_guard之後lock()和guard()之間的區別是什麼
- 22. 「層」和「層」之間有什麼區別?
- 23. Tableau和QlikView之間有什麼區別
- 24. Microsoft.CompilerServices.AsyncTargetingPack和Microsoft.Bcl.Async之間有什麼區別?
- 25. @Entity和@embeddable之間有什麼區別
- 26. ContentObservable和DataSetObservable之間有什麼區別?
- 27. touchmove和gesturechange之間有什麼區別?
- 28. :notification.flags和notification.defaults之間有什麼區別?
- 29. proc和lambda之間有什麼區別?
- 30. :: after和after之間有什麼區別?