消息摘要算法-SHA算法实现
簡述
SHA算法分為一代和二代,這個是美國安全局發布的一系列的密碼散列算法。
基于如下兩點安全理由:
1、從消息摘要反推輸入信息,從計算理論上來說很困難
2、想找到兩組不同的消息對應到相應的消息摘要,從計算理論上來說一額很困難。對任何消息的變動,都有很高幾率產生消息摘要迥異
?
不過這個算法已經不安全了,被中國的教授破解了。這個技術通常用來做數字簽名。常見的就是B2B,B2C網站的支付。數據post到支付中心的時候,是發送一些加密串,同時帶上簽名。而這個簽名可以被偽造。所以就不安全了。
?
常見的使用模型
1、甲方發布消息摘要算法(就是指定用哪個算法做消息摘要處理),然后對要發布的消息做摘要處理
2、甲方將消息以及消息摘要信息(這里大家通常叫摘要信息為數字指紋)發送給乙方
3、乙方接收后,用甲方指定的消息摘要算法,對消息進行摘要處理,然后比對是否和發送過來的消息摘要相同。以甄別消息真假
?
先讓我們用sun本身的jdk6的代碼展示下sha的消息摘要算法
?
package com.ca.test; import java.security.MessageDigest; /*** 下邊都是sun java6支持的消息摘要算法 * 進行sha的消息摘要算法處理* @author kongqz* */ public class SHACoder {/*** SHA-1消息摘要* @param 待處理的消息摘要* @author kongqz* * **/public static byte[] encodeSHA(byte[] data) throws Exception{//初始化MessageDisgestMessageDigest md= MessageDigest.getInstance("SHA");return md.digest(data);}/*** SHA-256消息摘要* @param 待處理的消息摘要* @author kongqz* * **/public static byte[] encodeSHA256(byte[] data) throws Exception{//初始化MessageDisgestMessageDigest md= MessageDigest.getInstance("SHA-256");return md.digest(data);}/*** SHA-384消息摘要* @param 待處理的消息摘要* @author kongqz* * **/public static byte[] encodeSHA384(byte[] data) throws Exception{//初始化MessageDisgestMessageDigest md= MessageDigest.getInstance("SHA-384");return md.digest(data);}/*** SHA-512消息摘要* @param 待處理的消息摘要* @author kongqz* * **/public static byte[] encodeSHA512(byte[] data) throws Exception{//初始化MessageDisgestMessageDigest md= MessageDigest.getInstance("SHA-512");return md.digest(data);}public static void main(String[] args) throws Exception {String str="java支持的SHA 消息摘要算法";System.out.println("原文:"+str);byte[] data1=SHACoder.encodeSHA(str.getBytes());System.out.println("SHA/SHA1的消息摘要算法值:"+data1.toString());byte[] data2=SHACoder.encodeSHA256(str.getBytes());System.out.println("SHA-256的消息摘要算法值:"+data2.toString());byte[] data3=SHACoder.encodeSHA384(str.getBytes());System.out.println("SHA-384的消息摘要算法值:"+data3.toString());byte[] data4=SHACoder.encodeSHA512(str.getBytes());System.out.println("SHA-512的消息摘要算法值:"+data4.toString());} } 控制臺輸出結果: 原文:java支持的SHA 消息摘要算法 SHA/SHA1的消息摘要算法值:[B@1fb8ee3 SHA-256的消息摘要算法值:[B@14318bb SHA-384的消息摘要算法值:[B@1a758cb SHA-512的消息摘要算法值:[B@69b332
?
令人遺憾的是這個不支持十六進制的轉換。
?
但是SHA-224沒人支持咋辦?這里bouncy castle又一次的站出來了。他支持了SHA-224的算法實現。代碼如下:
package com.ca.test; import java.security.MessageDigest; import java.security.Security; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; /*** bouncy castle 關于SHA224的消息摘要實現* @author kongqz* **/ public class SHA224Coder {/*** SHA-224 的消息摘要算法實現* @param data 待處理的數據* @return byte[] 消息摘要* * */public static byte[] encodeSHA224(byte[] data) throws Exception{//加入對bouncy castle的支持Security.addProvider(new BouncyCastleProvider());//初始化MessageDigestMessageDigest md=MessageDigest.getInstance("SHA-224");//執行消息摘要處理return md.digest(data);}/*** SHA-224 的消息摘要算法實現* @param data 待處理的數據* @return String 十六進制的消息摘要* @author kongqz* */public static String encodeSHA224Hex(byte[] data) throws Exception{//執行消息摘要處理byte[] b=encodeSHA224(data);return new String (Hex.encode(b));}public static void main(String[] args) throws Exception {String str="BouncyCast支持的SHA224 消息摘要算法";System.out.println("原文:"+str);byte[] data1=SHA224Coder.encodeSHA224(str.getBytes());System.out.println("SHA-224的消息摘要算法值:"+data1.toString());String data2=SHA224Coder.encodeSHA224Hex(str.getBytes());System.out.println("SHA-224 轉十六進制的消息摘要算法值:"+data2);} } 控制臺輸出結果: 原文:BouncyCast支持的SHA224 消息摘要算法 SHA-224的消息摘要算法值:[B@bfbdb0 SHA-224 轉十六進制的消息摘要算法值:621f3650aa5e604de6ef571372d93e7272fb110ea605d79d6c8ceb43
?
另外Commons codec也提供了對于SHA算法的實現。涵蓋了java6所支持的全部的SHA算法。可以參考下DigestUtils類相關SHA算法支持API.commons codec與sun提供的算法無本質差別。只是提供了更加方便的實現
?
通過如上的實驗,大家可以看到不同的消息摘要算法長度不同。
?
同時能總結如下:
?
1、sun提供了底層的sha算法實現,缺少sha-224算法,而且無法做進制轉換
2、bouncy castle對sun進行了補充,提供了sha-224算法以及16進制的字符串的摘要信息,比較方便
3、commons codec對sun的sha算法可以進行包裝,并且支持十六進制字符串形式的摘要信息,相當方便。
?
如果只是想用sha算法,不想用sha224算法支持。commons codec是不錯選擇。
想加16進制支持,就結合bouncycastle或者commons codec吧
?
總結
以上是生活随笔為你收集整理的消息摘要算法-SHA算法实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 负数的二进制表示
- 下一篇: oracle汉字默认排序,oracle对