我對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. ++和:haskell之間的區別是什麼?
- 3. $(())和expr之間的區別是什麼?
- 4. $(...)和`...`之間的區別是什麼
- 5. [undefined]和[,]之間的區別是什麼?
- 6. 區別:%% a和%variable%變量之間的區別是什麼?
- 7. MVC和MVVM之間的區別和相似之處是什麼?
- 8. TVF/UDF之間的區別是什麼
- 9. [EmailPasswordAuthProvider,EmailAuthProvider]之間的區別是什麼
- 10. Ruby和SHA256 - MacOS和Windows之間的區別?
- 11. dpm()和dsm()之間有什麼區別?
- 12. @dynamic和@synthesize之間有什麼區別?
- 13. vbNullString和「」之間有什麼區別嗎?
- 14. * zoom和zoom之間有什麼區別?
- 15. String.Concat,string.format和+之間有什麼區別?
- 16. StaticLayout和DynamicLayout之間有什麼區別
- 17. WebServiceBinding.EmitConformanceClaims和WebServiceBinding.ConformanceClaims之間有什麼區別?
- 18. :: after和after之間有什麼區別?
- 19. %.02f和%.2f之間有什麼區別?
- 20. {$ var}和$ var之間有什麼區別?
- 21. ReleaseFloatArrayElements和DeleteLocalRef之間有什麼區別
- 22. {0}和「」之間有什麼區別?
- 23. getA()和this.getA()之間有什麼區別?
- 24. @observable和@published之間有什麼區別
- 25. $ {}和#{}之間有什麼區別?
- 26. url.getFile()和getpath()之間有什麼區別?
- 27. KVC和Properties之間有什麼區別?
- 28. Lazy.Force()和Lazy.Value之間有什麼區別
- 29. 「層」和「層」之間有什麼區別?
- 30. 1.1em和1.05em之間有什麼區別?