欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

1.準(zhǔn)備工作

  所需jar包:

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

  對應(yīng)的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 加密與加密結(jié)果驗(yàn)證(不可逆算法)
 * @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進(jìn)制字符串
 */
public static String encrypt(String paramStr){
  // 將返回的hash值轉(zhuǎn)換成16進(jìn)制字符串
  String resultHexString = "";
  try {
    // 將字符串轉(zhuǎn)換成byte數(shù)組
    byte[] srcData = paramStr.getBytes(ENCODING);
    // 調(diào)用hash()
    byte[] resultHash = hash(srcData);
    // 將返回的hash值轉(zhuǎn)換成16進(jìn)制字符串
    resultHexString = ByteUtils.toHexString(resultHash);
  } catch (UnsupportedEncodingException e) {
    e.printStackTrace();
  }
  return resultHexString;
}
 
/**
 * 返回長度=32的byte數(shù)組
 * @explain 生成對應(yīng)的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;
}

  方式二:自定義密鑰

/**
 * 通過密鑰進(jìn)行加密
 * @explain 指定密鑰進(jìn)行加密
 * @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ù)校驗(yàn)

/**
 * 判斷源數(shù)據(jù)與加密數(shù)據(jù)是否一致
 * @explain 通過驗(yàn)證原數(shù)組和生成的hash數(shù)組是否為同一數(shù)組,驗(yàn)證2者是否為同一數(shù)據(jù)
 * @param srcStr
 *      原字符串
 * @param sm3HexString
 *      16進(jìn)制字符串
 * @return 校驗(yàn)結(jié)果
 */
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
  // 驗(yàn)證加密后的16進(jìn)制字符串與加密前的字符串是否相同
  boolean flag = Sm3Utils.verify(json, hex);
  System.out.println(flag);// true

}

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

相關(guān)文章

  • SpringBoot底層注解超詳細(xì)介紹

    SpringBoot底層注解超詳細(xì)介紹

    這篇文章主要介紹了SpringBoot底層注解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-09-09
  • 關(guān)于Java中你所不知道的Integer詳解

    關(guān)于Java中你所不知道的Integer詳解

    這篇文章主要給大家介紹了關(guān)于Java中你所不知道的一些關(guān)于Integer的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-12-12
  • Java深入講解static操作符

    Java深入講解static操作符

    static關(guān)鍵字基本概念我們可以一句話來概括:方便在沒有創(chuàng)建對象的情況下來進(jìn)行調(diào)用。也就是說:被static關(guān)鍵字修飾的不需要?jiǎng)?chuàng)建對象去調(diào)用,直接根據(jù)類名就可以去訪問,讓我們來了解一下你可能還不知道情況
    2022-07-07
  • Java并發(fā)編程之淺談ReentrantLock

    Java并發(fā)編程之淺談ReentrantLock

    今天帶大家學(xué)習(xí)Java并發(fā)編程的相關(guān)知識,文中對Java ReentrantLock作了非常詳細(xì)的圖文示例,對正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • BeanPostProcessor在顯示調(diào)用初始化方法前修改bean詳解

    BeanPostProcessor在顯示調(diào)用初始化方法前修改bean詳解

    這篇文章主要介紹了BeanPostProcessor在顯示調(diào)用初始化方法前修改bean詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Cookie 實(shí)現(xiàn)的原理

    Cookie 實(shí)現(xiàn)的原理

    我們在瀏覽器中,經(jīng)常涉及到數(shù)據(jù)的交換,比如你登錄郵箱,登錄一個(gè)頁面。我們經(jīng)常會在此時(shí)設(shè)置30天內(nèi)記住我,或者自動登錄選項(xiàng)。那么它們是怎么記錄信息的呢,答案就是今天的主角cookie了
    2021-06-06
  • SpringBoot中默認(rèn)緩存實(shí)現(xiàn)方案的示例代碼

    SpringBoot中默認(rèn)緩存實(shí)現(xiàn)方案的示例代碼

    這篇文章主要介紹了SpringBoot中默認(rèn)緩存實(shí)現(xiàn)方案,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Netty分布式ByteBuf使用directArena分配緩沖區(qū)過程解析

    Netty分布式ByteBuf使用directArena分配緩沖區(qū)過程解析

    這篇文章主要介紹了Netty分布式ByteBuf使用directArena分配緩沖區(qū)過程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • 1小時(shí)快速上手RabbitMQ(簡介及安裝過程)

    1小時(shí)快速上手RabbitMQ(簡介及安裝過程)

    RabbitMQ簡稱MQ全稱是Message Queue(消息隊(duì)列),是在消息的傳輸過程中保存消息的容器,多用于分布式系統(tǒng)之間進(jìn)行通信,本文給大家講解了RabbitMQ簡介與安裝,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友跟隨小編一起看看吧
    2023-01-01
  • Java使用阻塞隊(duì)列控制線程通信的方法實(shí)例詳解

    Java使用阻塞隊(duì)列控制線程通信的方法實(shí)例詳解

    這篇文章主要介紹了Java使用阻塞隊(duì)列控制線程通信的方法,結(jié)合實(shí)例形式詳細(xì)分析了java使用阻塞隊(duì)列控制線程通信的相關(guān)原理、方法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-09-09

最新評論