日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

消息摘要算法-SHA算法实现

發布時間:2023/12/29 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 消息摘要算法-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算法实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。