前言:
對於SHA安全雜湊演算法,以前沒怎麼使用過,僅僅是停留在聽說過的階段,今天在看圖片快取框架Glide原始碼時發現其快取的Key採用的不是MD5加密演算法,而是SHA-256加密演算法,這才勾起了我的好奇心,所以趁著晚上沒啥事,來學習一下。
其他幾種加密方式:
SHA加密演算法
SHA(Secure Hash Algorithm,安全雜湊演算法),數字簽名等密碼學應用中重要的工具,被廣泛地應用於電子商務等資訊保安領域。和MD5加密演算法一樣,也是一種不可逆的加密演算法,不過也可以通過窮舉法破解,但是SHA的破譯難度與成本要高於MD5,相對於MD5更加安全,現在已成為公認的最安全的雜湊演算法之一,並被廣泛使用。主要包括SHA-1,SHA-224,SHA-256,SHA-384,和SHA-512這幾種單向雜湊演算法。SHA-1,SHA-224和SHA-256適用於長度不超過2^64二進位制位的訊息。SHA-384和SHA-512適用於長度不超過2^128二進位制位的訊息。官方解說如下:
-
由訊息摘要反推原輸入訊息,從計算理論上來說是很困難的。
-
想要找到兩組不同的訊息對應到相同的訊息摘要,從計算理論上來說也是很困難的。任何對輸入訊息的變動,都有很高的機率導致其產生的訊息摘要迥異。
SHA加密原理
SHA加密優點
由於SHA也是有MD4演變過來的,所以其優點與MD5大致一樣
-
壓縮性:任意長度的資料,算出的SHA值長度都是固定的。
-
容易計算:從原資料計算出SHA值很容易。
-
抗修改性:對原資料進行任何改動,哪怕只修改1個位元組,所得到的SHA值都有很大區別。
-
強抗碰撞:已知原資料和其SHA值,想找到一個具有相同SHA值的資料(即偽造資料)是非常困難的。
SHA應用場景
-
一致性驗證
-
數字簽名
-
安全訪問認證
SHA加密的簡單實現
這裡程式碼演示以SHA-256為例。
public static String sha(String string) { if (TextUtils.isEmpty(string)) { return ""; } MessageDigest md5 = null; try { md5 = MessageDigest.getInstance("sha-256"); byte[] bytes = md5.digest((string ).getBytes()); String result = ""; for (byte b : bytes) { String temp = Integer.toHexString(b & 0xff); if (temp.length() == 1) { temp = "0" + temp; } result += temp; } return result; } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; }
SHA安全性探討
-
SHA-1在許多安全協議中廣為使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被視為是MD5(更早之前被廣為使用的雜湊函式)的後繼者。2005年,密碼學家就證明SHA-1的破解速度比預期提高了2000倍,雖然破解仍然是極其困難和昂貴的,但隨著計算機變得越來越快和越來越廉價,SHA-1演算法的安全性也逐年降低,已被密碼學家嚴重質疑,希望由安全強度更高的SHA-2替代它。
-
SHA-224、SHA-256、SHA-384,和SHA-512並稱為SHA-2。
-
新的雜湊函式並沒有接受像SHA-1一樣的公眾密碼社群做詳細的檢驗,所以它們的密碼安全性還不被大家廣泛的信任。
-
雖然至今尚未出現對SHA-2有效的攻擊,它的演算法跟SHA-1基本上仍然相似;因此有些人開始發展其他替代的雜湊演算法。
跨國公司事蹟:
Google官方部落格宣佈,將在Chrome瀏覽器中逐漸降低SHA-1證書的安全指示。但有意思的是Google.com目前使用的也是SHA-1簽名的證書,但證書將在3個月內過期,Google將從2015年起使用SHA-2簽名的證書。SHA-1演算法目前尚未發現嚴重的弱點,但偽造證書所需費用正越來越低。