資訊保安:資料加密實戰!對專案中資料使用MD5演算法進行加密

攻城獅Chova發表於2022-02-10

MD5加密演算法的實現原理

  • Java中MD5加密演算法的實現:

    public class MD5 {
      // 全域性陣列
      private final static String[] strDigit = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
    
      public class MD5 {
      }
    
      // 返回形式為數字和字串
      private static String byteToArrayString(byte bByte) {
          int iRet = bByte;
          if (iRet < 0) {
              iRet += 256;
          }
          int iD1 = iRet / 16;
          int iD2 = iRet % 16;
          return strDigits[iD1] + strDigits[iD2];
      }    
    
      // 返回形式只為數字
      private static String byteToNum(byte bByte) {
          int iRet = bByte;
          if (iRet < 0) {
              iRet += 256;
          }
          return String.valueOf(iRet);
      }
    
      // 將位元組陣列轉換成為16進位制的字串
      private static String byteToString(byte[] bByte) {
          StringBuffer stringBuffer = new StringBuffer();
          for (int i; i < bByte.length; i++) {
              StringBuffer.append(byteToArrayString(bByte[i]));
          }
          return stringBuffer.toString();
      }
    
      // 獲取MD5值
      public static String GetMD5Code(String strObj) {
          String resultString = null;
          try {
              resultString = new String();
              MessageDigest md5 = MessageDigest.getInstance("MD5");
              // md5.digest() - 返回值為存放Hash值結果的byte陣列
              resultString = byteToString(md5.digest(strObj.getBytes()));
          } catch (NoSuchAlgorithmException e) {
              e.printStackTrace();
          }
          return resultString;
      }
    } 

    MessageDigest類

  • MessageDigest類:

    • 為應用程式提供資訊摘要演算法的功能.比如MD5演算法和SHA演算法
    • 資訊摘要是安全的單向Hash函式 : 接收任意大小的資料,並輸出固定長度的Hash值

update

  • MessageDigest物件在開始時會被初始化
  • 物件通過呼叫update() 方法處理資料

    /**
     * 使用指定的byte陣列更新摘要
     *
     * @param input 指定的byte陣列
     */
    public void update(byte[] input);

    reset

  • 任何時候都可以呼叫reset() 方法重置摘要

    digest

  • 一旦所需要更新的資料都已經被更新後,應該呼叫digest() 方法完成Hash計算
  • 對於給定數量的更新資料 ,digest() 方法只能被呼叫一次.在呼叫digest() 方法之後,MessageDigest物件被重新設定成初始狀態

    /**
     * 通過執行諸如填充之類的最終操作完成Hash計算. 
     * 在呼叫此方法之後,摘要被重置
     *
     * @return byte[] Hash計算後的byte陣列
     */
    public byte[] digest();

    isEqual

    /**
     * 比較兩個摘要的相等性.做簡單的位元組比較
     *
     * @param digestA 比較的摘要位元組陣列A
     * @param digestB 比較的摘要位元組陣列B
     * @return boolean 是否相等
     */
    public static boolean isEqual(byte[] digestA, byte[] digestB);

    getInstance

  • 返回實現指定摘要演算法的MessageDigest物件

    /**
     * 返回實現指定摘要演算法的MessageDigest物件
     *
     * @param algorithm 請求的演算法的名稱
     * @param provider 提供者名稱
     * @return MessageDigest 指定摘要演算法的MessageDigest物件
     * @throws NoSuchAlgorithmException 當指定的請求演算法名稱不存在時丟擲異常
     */
    public static MessageDigest getInstance(String algorithm) throws NoSuchAlgorithmException; 
    
    /**
     * 返回實現指定摘要演算法的MessageDigest物件
     *
     * @param algorithm 請求演算法的名稱
     * @return MessageDigest 指定摘要演算法的MessageDigest物件
     * @throws NoSuchAlgorithmException 當指定的請求演算法名稱不存在時丟擲異常
     */
    public static MessageDigest getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException;
  • Provider可以通過java.security.SecuritygetProviders() 方法獲得已註冊的提供者列表
  • SUN提供的常用的演算法:

    • MD2
    • MD5
    • SHA-1
    • SHA-256
    • SHA-384
    • SHA-512

      字串的MD5加密演算法

  • 使用Java自帶的MessageDigest實現對文字的MD5加密演算法:

    /**
     * 將字串轉換為MD5
     */
     public class ParseMD5 {
       public static String parseStrToMd5L32(String str) {
           // 將字串轉換為32位小寫MD5 
           String reStr = null;
           try {
               MessageDigest md5 = MessageDigest.getInstance("MD5");
               byte[] bytes = md5.digest(str.getBytes());
               StringBuffer stringBuffer = new StringBuffer();
               for (byte b : bytes) {
                   int bt = b&0xff;
                   if (bt < 16) {
                       stringBuffer.append(0);
                   }
                   stringBuffer.append(Integer.toHexString(bt));
               }
               reStr = stringBuffer.toString();
           } catch (NoSuchAlgorithmException e) {
               e.printStackTrace();
           }
           return reStr;
       }
    
      // 將字串轉換為32位大寫的MD5
      public static String parseStrToMd5U32(String str) {
          String reStr = parseStrToMd5L32(str);
          if (reStr != null) {
              reStr = reStr.toUpperCase();
          }
          return resStr;
      }
    
      // 將字串轉換為16位小寫的MD5
      public static String parseStrToMd5L16(String str) {
          String reStr = paseStrToMd5L32(str);
          if (reStr != null) {
              reStr = reStr.subString(8, 24);
          }
          return reStr;
      }
    
      // 將字串轉換為16位大寫的MD5
      public static String parseStrToMd5U16(String str) {
          String reStr = parseStrToMd5L32(str);
          if (reStr != null) {
              reStr = reStr.toUpperCase().subString(8, 24);
          }
          return reStr;
      }
     }

    文字的MD5加密工具類

  • Java中提供了自帶的MessageDigest實現對文字的加密演算法. 對文字進行加密的MD5加密工具類如下:

    public class MD5Util {
      // 將文字轉換為32位小寫的MD5
      public static String textToMd5L32(String plainText) {
          String result = null;
          // 判斷需要轉換的文字是否為空
          if (StringUtils.isBlank(plainText)) {
              return null;
          }
          try {
              // 進行例項化和初始化
              MessageDigest md5 = MessageDigest.getInstance("MD5");
              // 得到一個作業系統預設的位元組編碼格式的位元組陣列
              byte[] byteInput = plainText.getBytes();
              // 對得到的位元組陣列進行處理
              md5.update(byteInput);
              // 進行Hash計算並得到返回結果
              byte[] btResult = md5.digest();
              // 得到進行Hash計算後資料的長度
              StringBuffer stringBuffer = new StringBuffer();
              for (byte b : btResult) {
                  int bt = b&0xff;
                  if (bt < 16) {
                      stringBuffer.append(0);
                  }
                  stringBuffer.append(Integer.toHexString(bt));
              }
              reStr = stringBuffer.toString();
          } catch (NoSuchAlgorithmException e) {
              e.printStackTrace();
          }
          return reStr;
      }
    
      // 將文字轉換為32位大寫的MD5
      public static String textToMd5U32(String plainText) {
          if (StringUtils.isBlank(plainText)) {
              return null;
          }
          String result = textToMd5L32(plainText);
          result = result.toUpperCase();
          return result;
      }    
    }

相關文章