「Java工具類」AES對稱加密工具類
介紹語
本頭條號主要是Java常用關鍵技術點,通用工具類的分享;以及springboot+springcloud+Mybatisplus+druid+mysql+redis+swagger+maven+docker等集成框架的技術分享;datax、kafka、flink等大數據處理框架的技術分享。文章會不斷更新,歡迎碼友關注點贊收藏轉發!
關注多的話,后面會錄制一些視頻教程,圖文和視頻結合,比如:圖書介紹網站系統、搶購系統、大數據中臺系統等。技術才是程序猿的最愛,碼友們沖啊
如果碼友覺得代碼太長,可以從頭到尾快速掃射一遍,了解大概即可。覺得有用后再轉發收藏,以備不時之需。
正文:
項目中你的數據庫密碼不會是直接明文吧?如果是,那請你考慮下是不是有安全風險呀。我的項目中涉及到密碼的,都用這個工具類進行加密,在配置文件(如bootstrap.yml)中配置加密后的密文,在數據庫配置類中再解密,這樣數據庫的密碼就不會裸奔了。下面給出使用的案例簡單截圖,以后也會分享對mysql密碼進行加密處理的案例和源碼。
mysql使用案例截圖
在配置文件中配置加密后的密文

在配置了中解密

工具類使用例子。(已修改了工具類的方法名)

上面案例使用的工具類:
import org.apache.commons.codec.binary.Base64;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
/**
* AES加解密工具類
*
* @author liangxn
*/
public class AesUtil {
/**
* SecureRandom類的seed,可以改為自己的字符串
*/
private static final String RANDOM_SEED = "seed-abcxyz-123-456";
private AesUtil() {}
/**
* 加密方法
*/
public static String encrypt(String content) {
// 待加密的內容
byte[] contentByte = content.getBytes(StandardCharsets.UTF_8);
byte[] data = new byte[0];
try {
data = cipher(contentByte, Cipher.ENCRYPT_MODE);
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace();
}
return new String(Base64.encodeBase64(data), StandardCharsets.UTF_8);
}
/**
* 加密方法
*/
public static String decrypt(String content) {
byte[] decodeContent = Base64.decodeBase64(content);
byte[] data = new byte[0];
try {
data = cipher(decodeContent, Cipher.DECRYPT_MODE);
} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
e.printStackTrace();
}
return new String(data, StandardCharsets.UTF_8);
}
/**
* 加解密計算器
*
* @param content 要加密的內容
* @param mode 計算模式(本工具類用到Cipher.ENCRYPT_MODE、Cipher.DECRYPT_MODE這兩個)
* @return
*/
private static byte[] cipher(byte[] content, int mode) throws NoSuchAlgorithmException, NoSuchPaddingException,
InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
if (content == null) {
throw new NullPointerException("content為空");
}
if (mode != Cipher.ENCRYPT_MODE && mode != Cipher.DECRYPT_MODE) {
throw new IllegalArgumentException("mode非法");
}
// AES密鑰生成器實例
KeyGenerator keygen = KeyGenerator.getInstance("AES");
// 安全隨機數工具,創建SHA1PRNG隨機算法的實例
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
// 設置種子
random.setSeed(AesUtil.RANDOM_SEED.getBytes(StandardCharsets.UTF_8));
// 初始化密鑰生產器
keygen.init(128, random);
// 生成原始對稱密鑰
SecretKey secretKey = keygen.generateKey();
// 獲得原始對稱密鑰的字節數組
byte[] secretKeyByte = secretKey.getEncoded();
// 生成AES密鑰
SecretKey key = new SecretKeySpec(secretKeyByte, "AES");
// 創建密碼器
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
// 初始化密碼器
cipher.init(mode, key);
// 數據加密
return cipher.doFinal(content);
}
}
鄙人編碼十年多,在項目中也積累了一些工具類,很多工具類在每個項目都有在用,很實用。大部分是鄙人封裝的,有些工具類是同事封裝的,有些工具類已經不記得是ctrl+c的還是自己封裝的了,現在有空就會總結項目中大部分的工具類,分享給各位碼友。如果文章中涉及的代碼有侵權行為請通知鄙人處理。
計劃是先把工具類整理出來,正所謂工欲善其事,必先利其器。項目中不管是普通單體項目還是多模塊maven項目或是分布式微服務,一部分功能模塊都是可以重用的,工具類模塊就是其中之一。

浙公網安備 33010602011771號