1. 程式人生 > 程式設計 >Java中MessageDigest來實現資料加密的方法

Java中MessageDigest來實現資料加密的方法

MessageDigest

MessageDigest 類為應用程式提供資訊摘要演算法的功能,如 MD5 或 SHA 演算法。資訊摘要是安全的單向雜湊函式,它接收任意大小的資料,輸出固定長度的雜湊值。

MessageDigest 物件開始被初始化。該物件通過使用 update 方法處理資料。任何時候都可以呼叫 reset 方法重置摘要。一旦所有需要更新的資料都已經被更新了,應該呼叫 digest 方法之一完成雜湊計算。

對於給定數量的更新資料,digest 方法只能被呼叫一次。digest 被呼叫後,MessageDigest 物件被重新設定成其初始狀態。

舉個簡單的md5加密的例子:

package com.company;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MessageDigestTest {

  public static void main(String[] args) throws NoSuchAlgorithmException {

    String source = "123123";
    String md5Str = getMd5(source);


    System.out.println(md5Str);

  }

  /**
   * 通過md5進行加密
   * @param source 要加密的資料
   * @return
   * @throws NoSuchAlgorithmException
   */
  private static String getMd5(String source) throws NoSuchAlgorithmException {
    //1.獲取MessageDigest物件
    MessageDigest digest = MessageDigest.getInstance("md5");

    //2.執行加密操作
    byte[] bytes = source.getBytes();

    //在MD5演算法這,得到的目標位元組陣列的特點:長度固定為16
    byte[] targetBytes = digest.digest(bytes);

    //3.宣告字元陣列
    char [] characters = new char[]{'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

    //4.遍歷targetBytes
    StringBuilder builder = new StringBuilder();
    for (byte b : targetBytes) {
      //5.取出b的高四位的值
      //先把高四位通過右移操作拽到低四位
      int high = (b >> 4) & 15;

      //6.取出b的低四位的值
      int low = b & 15;

      //7.以high為下標從characters中取出對應的十六進位制字元
      char highChar = characters[high];

      //8.以low為下標從characters中取出對應的十六進位制字元
      char lowChar = characters[low];

      builder.append(highChar).append(lowChar);
    }

    return builder.toString();
  }
}

測試結果:

4297F44B13955235245B2497399D7A93

封裝成工具類:

package com.company;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Tool {
  private static ThreadLocal<MD5Tool> md5ToolThreadLocal = new ThreadLocal<>();

  private MD5Tool() {
  }

  /**
   * 獲取一個MD5工具例項
   */
  public static MD5Tool getInstance() {
    if (md5ToolThreadLocal.get() == null) {
      md5ToolThreadLocal.set(new MD5Tool());
    }
    return md5ToolThreadLocal.get();
  }

  /**
   * 通過md5進行加密
   *
   * @param source 要加密的資料
   * @return
   * @throws NoSuchAlgorithmException
   */
  public String getMd5(String source) throws NoSuchAlgorithmException {
    //1.獲取MessageDigest物件
    MessageDigest digest = MessageDigest.getInstance("md5");

    //2.執行加密操作
    byte[] bytes = source.getBytes();

    //在MD5演算法這,得到的目標位元組陣列的特點:長度固定為16
    byte[] targetBytes = digest.digest(bytes);

    //3.宣告字元陣列
    char[] characters = new char[]{'0','F'};

    //4.遍歷targetBytes
    StringBuilder builder = new StringBuilder();
    for (byte b : targetBytes) {
      //5.取出b的高四位的值
      //先把高四位通過右移操作拽到低四位
      int high = (b >> 4) & 15;

      //6.取出b的低四位的值
      int low = b & 15;

      //7.以high為下標從characters中取出對應的十六進位制字元
      char highChar = characters[high];

      //8.以low為下標從characters中取出對應的十六進位制字元
      char lowChar = characters[low];

      builder.append(highChar).append(lowChar);
    }

    return builder.toString();
  }

}

到此這篇關於Java中MessageDigest來實現資料加密的方法的文章就介紹到這了,更多相關MessageDigest 資料加密內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!