對於SHA安全散列算法,之前沒怎麼使用過,僅僅是停留在據說過的階段,今天在看圖片緩存框架Glide源碼時發現其緩存的Key採用的不是MD5加密算法,而是SHA-256加密算法,這才勾起了個人好奇心,因此趁着晚上沒啥事,來學習一下。html
其餘幾種加密方式:算法
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二進制位的消息。官方解說以下:工具
由消息摘要反推原輸入消息,從計算理論上來講是很困難的。post
想要找到兩組不一樣的消息對應到相同的消息摘要,從計算理論上來講也是很困難的。任何對輸入消息的變更,都有很高的機率致使其產生的消息摘要迥異。
因爲SHA也是有MD4演變過來的,因此其優勢與MD5大體同樣
壓縮性:任意長度的數據,算出的SHA值長度都是固定的。
容易計算:從原數據計算出SHA值很容易。
抗修改性:對原數據進行任何改動,哪怕只修改1個字節,所獲得的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-1在許多安全協議中廣爲使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被視爲是MD5(更早以前被廣爲使用的散列函數)的後繼者。2005年,密碼學家就證實SHA-1的破解速度比預期提升了2000倍,雖然破解仍然是極其困難和昂貴的,但隨着計算機變得愈來愈快和愈來愈廉價,SHA-1算法的安全性也逐年下降,已被密碼學家嚴重質疑,但願由安全強度更高的SHA-2替代它。
SHA-22四、SHA-25六、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算法目前還沒有發現嚴重的弱點,但僞造證書所需費用正愈來愈低。