最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java sm3加密算法的實現(xiàn)

 更新時間:2020年10月20日 10:42:45   作者:Marydon  
這篇文章主要介紹了Java sm3加密算法的實現(xiàn),幫助大家更好的利用Java進行加密,感興趣的朋友可以了解下

1.準備工作

  所需jar包:

  bcprov-jdk15on-1.59.jar
  commons-lang3-3.1.jar

  對應的maven依賴

<!--sm3,sm4加密算法-->
<dependency>
 <groupId>org.bouncycastle</groupId>
 <artifactId>bcprov-jdk15on</artifactId>
 <version>1.66</version>
</dependency> 
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import java.io.UnsupportedEncodingException;
import java.security.Security;
import java.util.Arrays;
/**
 * sm3加密算法工具類
 * @explain 加密與加密結果驗證(不可逆算法)
 * @author Marydon
 * @creationTime 2018年7月5日上午10:01:24
 * @version 1.0
 * @since
 * @email marydon20170307@163.com
 */
public class Sm3Utils {
 
  private static final String ENCODING = "UTF-8";
  static {
    Security.addProvider(new BouncyCastleProvider());
  }
} 

2.SM3加密

  方式一:不提供密鑰

/**
 * sm3算法加密
 * @explain
 * @param paramStr
 *      待加密字符串
 * @return 返回加密后,固定長度=32的16進制字符串
 */
public static String encrypt(String paramStr){
  // 將返回的hash值轉換成16進制字符串
  String resultHexString = "";
  try {
    // 將字符串轉換成byte數(shù)組
    byte[] srcData = paramStr.getBytes(ENCODING);
    // 調用hash()
    byte[] resultHash = hash(srcData);
    // 將返回的hash值轉換成16進制字符串
    resultHexString = ByteUtils.toHexString(resultHash);
  } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
  }
  return resultHexString;
}
 
/**
 * 返回長度=32的byte數(shù)組
 * @explain 生成對應的hash值
 * @param srcData
 * @return
 */
public static byte[] hash(byte[] srcData) {
  SM3Digest digest = new SM3Digest();
  digest.update(srcData, 0, srcData.length);
  byte[] hash = new byte[digest.getDigestSize()];
  digest.doFinal(hash, 0);
  return hash;
}

  方式二:自定義密鑰

/**
 * 通過密鑰進行加密
 * @explain 指定密鑰進行加密
 * @param key
 *      密鑰
 * @param srcData
 *      被加密的byte數(shù)組
 * @return
 */
public static byte[] hmac(byte[] key, byte[] srcData) {
  KeyParameter keyParameter = new KeyParameter(key);
  SM3Digest digest = new SM3Digest();
  HMac mac = new HMac(digest);
  mac.init(keyParameter);
  mac.update(srcData, 0, srcData.length);
  byte[] result = new byte[mac.getMacSize()];
  mac.doFinal(result, 0);
  return result;
}

3.加密數(shù)據(jù)校驗

/**
 * 判斷源數(shù)據(jù)與加密數(shù)據(jù)是否一致
 * @explain 通過驗證原數(shù)組和生成的hash數(shù)組是否為同一數(shù)組,驗證2者是否為同一數(shù)據(jù)
 * @param srcStr
 *      原字符串
 * @param sm3HexString
 *      16進制字符串
 * @return 校驗結果
 */
public static boolean verify(String srcStr, String sm3HexString) {
  boolean flag = false;
  try {
    byte[] srcData = srcStr.getBytes(ENCODING);
    byte[] sm3Hash = ByteUtils.fromHexString(sm3HexString);
    byte[] newHash = hash(srcData);
    if (Arrays.equals(newHash, sm3Hash))
      flag = true;
  } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
  }
  return flag;
} 

4.測試

public static void main(String[] args) {
  // 測試二:json
  String json = "{\"name\":\"Marydon\",\"website\":\"http://www.cnblogs.com/Marydon20170307\"}";
  String hex = Sm3Utils.encrypt(json);
  System.out.println(hex);// 0b0880f6f2ccd817809a432420e42b66d3772dc18d80789049d0f9654efeae5c
  // 驗證加密后的16進制字符串與加密前的字符串是否相同
  boolean flag = Sm3Utils.verify(json, hex);
  System.out.println(flag);// true

}

以上就是Java sm3加密算法的實現(xiàn)的詳細內容,更多關于Java sm3加密算法的資料請關注腳本之家其它相關文章!

相關文章

  • maven資源過濾打包后文件變大的處理方法

    maven資源過濾打包后文件變大的處理方法

    maven目前在web上面的使用方式很普遍,而打包的方式也存在很多方式,下面這篇文章主要給大家介紹了關于maven資源過濾打包后文件變大的處理方法,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2018-07-07
  • 關于SpringCloud分布式系統(tǒng)中實現(xiàn)冪等性的幾種方式

    關于SpringCloud分布式系統(tǒng)中實現(xiàn)冪等性的幾種方式

    這篇文章主要介紹了關于SpringCloud分布式系統(tǒng)中實現(xiàn)冪等性的幾種方式,冪等函數(shù),或冪等方法,是指可以使用相同參數(shù)重復執(zhí)行,并能獲得相同結果的函數(shù),這些函數(shù)不會影響系統(tǒng)狀態(tài),也不用擔心重復執(zhí)行會對系統(tǒng)造成改變,需要的朋友可以參考下
    2023-10-10
  • Java設計模式之備忘錄模式_動力節(jié)點Java學院

    Java設計模式之備忘錄模式_動力節(jié)點Java學院

    我們在編程的時候,經常需要保存對象的中間狀態(tài),當需要的時候,可以恢復到這個狀態(tài)。接下來通過本文給大家分享java設計模式之備忘錄模式,感興趣的的朋友一起看看吧
    2017-08-08
  • SpringBoot項目使用validated實現(xiàn)參數(shù)校驗框架

    SpringBoot項目使用validated實現(xiàn)參數(shù)校驗框架

    當談到Spring的參數(shù)校驗功能時,@Validated注解無疑是一個重要的利器,它為我們提供了一種簡單而又強大的方式來驗證請求參數(shù)的合法性,保證了系統(tǒng)的穩(wěn)定性和安全性,本文將介紹Spring Validated的基本用法以及在實際項目中的應用,需要的朋友可以參考下
    2024-05-05
  • Java中wait與sleep的區(qū)別講解(wait有參及無參區(qū)別)

    Java中wait與sleep的區(qū)別講解(wait有參及無參區(qū)別)

    這篇文章主要介紹了Java中wait與sleep的講解(wait有參及無參區(qū)別),通過代碼介紹了wait()?與wait(?long?timeout?)?區(qū)別,wait(0)?與?sleep(0)區(qū)別,需要的朋友可以參考下
    2022-04-04
  • 詳解Spring AOP 實現(xiàn)主從讀寫分離

    詳解Spring AOP 實現(xiàn)主從讀寫分離

    本篇文章主要介紹了Spring AOP 實現(xiàn)主從讀寫分離,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Java排序算法總結之堆排序

    Java排序算法總結之堆排序

    這篇文章主要介紹了Java排序算法總結之堆排序,詳細分析了堆排序的原理與java實現(xiàn)技巧,需要的朋友可以參考下
    2015-05-05
  • SpringSecurity6.4中一次性令牌登錄(One-Time Token Login)實現(xiàn)

    SpringSecurity6.4中一次性令牌登錄(One-Time Token Login)實現(xiàn)

    Spring Security為一次性令牌認證提供了支持,本文就來介紹一下SpringSecurity6.4中一次性令牌登錄(One-Time Token Login)實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2025-03-03
  • Java幾個實例帶你進階升華上篇

    Java幾個實例帶你進階升華上篇

    與其明天開始,不如現(xiàn)在行動,本文為你帶來幾個Java書寫的實際案例,對鞏固編程的基礎能力很有幫助,快來一起往下看看吧
    2022-03-03
  • 高并發(fā)下restTemplate的錯誤分析方式

    高并發(fā)下restTemplate的錯誤分析方式

    這篇文章主要介紹了高并發(fā)下restTemplate的錯誤分析方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評論

芦溪县| 永吉县| 乌海市| 轮台县| 高尔夫| 肇东市| 津市市| 武功县| 祁连县| 崇礼县| 山东省| 醴陵市| 湖北省| 定安县| 星子县| 河津市| 中卫市| 博罗县| 宁化县| 安图县| 仲巴县| 鹿邑县| 乌兰浩特市| 满洲里市| 景泰县| 紫阳县| 桂平市| 翁牛特旗| 揭东县| 南投县| 通城县| 石河子市| 铅山县| 凤冈县| 延吉市| 广水市| 绥德县| 济宁市| 桂平市| 巴楚县| 新竹县|