SHA,即Security Hash Algorithm縮寫,和MD5類似都是信息摘要算法,主要用于數字簽名,網絡支付,用戶登錄,密碼校驗等場景。
網上流傳的SHA算法繁多,像SHA1,SHA224,SHA256等等,其實SHA就3個版本,SHA1,SHA2,SHA3,這其中SHA2又包含了SHA224,SHA256,SHA384,SHA512, SHA3同樣包含了SHA3-224/256/384/512,他們共同組成了SHA大家族。
SHA1
SHA1可以根據明文生成160bit密文(信息摘要),例如:
明文:abcd
信息摘要:81FE8BFE87576C3ECB22426F8E57847382917ACF20
那么與MD5有什么區別?
1.摘要長度不同,MD5為128,SHA1為160位,多出的32位可以讓明文的碰撞概率減少2^32倍,破解難度增加,安全性更高。
2.摘要長度增加,意味著性能的降低,SHA的性能比MD5要略低。
但即使如此,Marc Stevens、Pierre Karpman和Thomas Peyrin使用Amazon支持的64-GPU集群(稱為Kraken)運行SHA-1內部壓縮功能的freestart來碰撞目標,不到10小時便破解了SHA1的摘要信息。
谷歌在2017年宣布停止對SHA1證書的支持,同樣微軟終止了IE對SHA1的支持。然而,Facebook和Cloudflare提倡更優雅的退休,這樣使無法升級到SHA-2的瀏覽器將繼續工作。
SHA2
SHA-2是一系列SHA算法變體的總稱,其中包含如下子版本:
SHA-256:可以生成長度256bit的信息摘要。
SHA-224:SHA-256的“閹割版”,可以生成長度224bit的信息摘要。
SHA-512:可以生成長度512bit的信息摘要。
SHA-384:SHA-512的“閹割版”,可以生成長度384bit的信息摘要。
顯然,信息摘要越長,發生碰撞的幾率就越低,破解的難度就越大。但同時,耗費的性能和占用的空間也就越高。SHA2繁多的種類使靈活性提高了不少,我們可以使用不同的摘要長度滿足不同的場景。比如簡單的驗證數據,使用SHA-256就足夠了,使用SHA-512顯然是小題大做了。除此之外,如果對安全性追求很高的話,可以使用MD5和SHA2混合算法。如下:

分別對"abcd",生成MD5和SHA-256摘要,取MD5的前16位,SHA-256的后20位拼接成36位的摘要,這樣就在不知道拼接規則的前提下,摘要幾乎不可能被破解。
SHA1和SHA2原理

SHA-1算法
核心過程大同小異,主要的不同點是把160bit的信息摘要分成了A,B,C,D,E五段。其他的與MD5類似。

SHA-2系列算法
把信息摘要分成了A,B,C,D,E,F,G,H八段。
其中SHA-256的每一段摘要長度是32bit,SHA-512的每一段摘要長度是64bit。SHA-224和SHA-384則是在前兩者生成結果的基礎上做出裁剪。
關于SHA3
由Guido Bertoni、Joan Daemen、Gills Van Assche、Michael Peeters共同設計的Keccak算法最終確定為SHA-3標準,其中Joan Daemen也是對稱密碼算法AES的設計之一。
基于NIST所設定的條件,我們能夠免費、自由地使用SHA-3算法,這與AES的情形完全相同。不過,SHA-3的出現并不意味著SHA-2就不安全了,在一段時間內,SHA-2和SHA-3還將會共存。
目前關于SHA3,多用于數字貨幣加密,其他項目大部分都是用SHA2做加密手段。SHA3的優勢如下:
- 采用了與SHA-2完全不同的結構。
- 結構清晰,易于分析
- 能夠適用于各種設備,也適用與嵌入式應用
- 在硬件上的實現顯示出很高的性能
- 比其他最終候選算法安全性邊界更大
對SHA3感興趣的請自行查看其官方文檔,本文不再過多贅述。
開源工具
與MD5一樣,JDK提供了豐富非支持。

結果:
明文:abcd SHA密文: 81FE8BFE87576C3ECB22426F8E57847382917ACF20 SHA1密文: 81FE8BFE87576C3ECB22426F8E57847382917ACF20 SHA224密文: A76654D8E3550E9A2D67A0EEB6C67B220E5885EDDD3FDE135806E60128 SHA256密文: 88D4266FD4E6338D13B845FCF289579D209C897823B9217DA3E161936F03158932 SHA384密文: 1165B3406FF0B52A3D24721F785462CA2276C9F454A116C2B2BA20171A7905EA5A026682EB659C4D5F115C363AA3C79B48 SHA512密文: D8022F2060AD6EFD297AB73DCC5355C9B214054B0D1776A136A669D26A7D3B14F73AA0D0EBFF19EE333368F0164B6419A96DA49E3E481753E7E96B716BDCCB6F6
其實JAVA中SHA和SHA1就是指的SHA1加密,本文到此結束了。喜歡就關注一下吧,跟我一塊進步哦。