天天看點

對Java配置檔案中敏感資訊進行加解密的工具類

在 JavaEE 配置檔案中,例如 XML 或者 properties 檔案,由于某些敏感資訊不希望普通人員看見,則可以采用加密的方式存儲,程式讀取後進行解密。

常見的如: 資料庫使用者密碼,短信平台使用者密碼,系統間校驗的固定密碼等。

package com.cncounter.util.comm;

import java.security.Key;
import java.security.SecureRandom;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class DESUtils {

  // 密鑰
  private static Key key;
  // KEY種子
  private static String KEY_STR = "[email protected]";
  // 常量
  public static final String UTF_8 = "UTF-8";
  public static final String DES = "DES";

  // 靜态初始化
  static{
    try {
      // KEY 生成器
      KeyGenerator generator = KeyGenerator.getInstance(DES);
      // 初始化,安全随機算子
      generator.init(new SecureRandom( KEY_STR.getBytes(UTF_8) ));
      // 生成密鑰
      key = generator.generateKey();
      generator = null;
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
  }

  /**
   * 對源字元串加密,傳回 BASE64編碼後的加密字元串
   * @param source 源字元串,明文
   * @return 密文字元串
   */
  public static String encode(String source){
    try {
      // 根據編碼格式擷取位元組數組
      byte[] sourceBytes = source.getBytes(UTF_8);
      // DES 加密模式
      Cipher cipher = Cipher.getInstance(DES);
      cipher.init(Cipher.ENCRYPT_MODE, key);
      // 加密後的位元組數組
      byte[] encryptSourceBytes = cipher.doFinal(sourceBytes);
      // Base64編碼器
      BASE64Encoder base64Encoder = new BASE64Encoder();
      return base64Encoder.encode(encryptSourceBytes);
    } catch (Exception e) {
      // throw 也算是一種 return 路徑
      throw new RuntimeException(e);
    }
  }

  /**
   * 對本工具類 encode() 方法加密後的字元串進行解碼/解密
   * @param encrypted 被加密過的字元串,即密文
   * @return 明文字元串
   */
  public static String decode(String encrypted){
    // Base64解碼器
    BASE64Decoder base64Decoder = new BASE64Decoder();
    try {
      // 先進行base64解碼
      byte[] cryptedBytes = base64Decoder.decodeBuffer(encrypted);
      // DES 解密模式
      Cipher cipher = Cipher.getInstance(DES);
      cipher.init(Cipher.DECRYPT_MODE, key);
      // 解碼後的位元組數組
      byte[] decryptStrBytes = cipher.doFinal(cryptedBytes);
      // 采用給定編碼格式将位元組數組變成字元串
      return new String(decryptStrBytes, UTF_8);
    } catch (Exception e) {
      // 這種形式确實适合處理工具類
      throw new RuntimeException(e);
    }
  }
  // 單元測試
  public static void main(String[] args) {
    // 需要加密的字元串
    String email = "[email protected]";
    // 加密
    String encrypted = DESUtils.encode(email);
    // 解密
    String decrypted = DESUtils.decode(encrypted);
    // 輸出結果;
    System.out.println("email: " + email);
    System.out.println("encrypted: " + encrypted);
    System.out.println("decrypted: " + decrypted);
    System.out.println("email.equals(decrypted): " + email.equals(decrypted));
  }
}