Java通過MySQL的加解密函數(shù)實現(xiàn)敏感字段存儲
java通過mysql的加解密函數(shù)實現(xiàn)敏感字段存儲
1.AES加解密工具類:
public class AESUtils {
public static String encrypt(String password, String strKey) {
try {
SecretKey key = generateMySQLAESKey(strKey,"ASCII");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] cleartext = password.getBytes("UTF-8");
byte[] ciphertextBytes = cipher.doFinal(cleartext);
return new String(Hex.encodeHex(ciphertextBytes));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return null;
}
public static String decrypt(String content, String aesKey){
try {
SecretKey key = generateMySQLAESKey(aesKey,"ASCII");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] cleartext = Hex.decodeHex(content.toCharArray());
byte[] ciphertextBytes = cipher.doFinal(cleartext);
return new String(ciphertextBytes, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (DecoderException e) {
e.printStackTrace();
}
return null;
}
public static SecretKeySpec generateMySQLAESKey(final String key, final String encoding) {
try {
final byte[] finalKey = new byte[16];
int i = 0;
for(byte b : key.getBytes(encoding))
finalKey[i++%16] ^= b;
return new SecretKeySpec(finalKey, "AES");
} catch(UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
public static String getAesKey(){
StringBuilder sb = new StringBuilder();
Random random = new Random();
for(int i = 0; i < 16; i++){
sb.append(random.nextInt(10));
}
return sb.toString();
}
public static void main(String[] args){
String abc = "1";
String aeskey = "3532263592381276";
String a1= encrypt(abc, aeskey);
System.out.println("加密后:" + a1);
System.out.println("解密后:" +decrypt(a1, aeskey));
}
}
運行main方法結果:
加密后:62b778a8ccaa40cce4c9e4e42c693665
解密后:1
2.mysql的sql加解密:
生成16隨機鹽:3532263592381276
select concat((SELECT CEILING(RAND()*9000000000000000+1000000000000000)),'');
加密:62B778A8CCAA40CCE4C9E4E42C693665
SELECT (HEX(AES_ENCRYPT(1,"3532263592381276")))
解密:1
SELECT AES_DECRYPT(UNHEX("62B778A8CCAA40CCE4C9E4E42C693665"),"3532263592381276")
3.實現(xiàn)效果:
java工具類加解密和mysql的加解密效果是一樣的。
知識點補充
mysql下的加密函數(shù)有如下幾個
PASSWORD():創(chuàng)建一個經(jīng)過加密的密碼字符串,適合于插入到MySQL的安全系
統(tǒng)。該加密過程不可逆,和unix密碼加密過程使用不同的算法。主要用于MySQL的認證系統(tǒng)。
ENCRYPT(,):使用UNIX crypt()系統(tǒng)加密字符串,ENCRYPT()函數(shù)接收要加密的字符串和(可選的)用于加密過程的salt(一個可以唯一確定口令的字符串,就像鑰匙一樣),注意,windows上不支持
ENCODE(,) DECODE(,):加密解密字符串。該函數(shù)有兩個參數(shù):被加密或解密的字符串和作為加密或解密基礎的密鑰。Encode結果是一個二進制字符串,以BLOB類型存儲。加密成都相對比較弱
MD5():計算字符串的MD5校驗和(128位)
SHA5():計算字符串的SHA5校驗和(160位)
以上兩個函數(shù)返回的校驗和是16進制的,適合與認證系統(tǒng)中使用的口令。
到此這篇關于Java通過MySQL的加解密函數(shù)實現(xiàn)敏感字段存儲的文章就介紹到這了,更多相關Java敏感字段存儲內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
mybatis如何通過接口查找對應的mapper.xml及方法執(zhí)行詳解
這篇文章主要給大家介紹了利用mybatis如何通過接口查找對應的mapper.xml及方法執(zhí)行的相關資料,文中通過示例代碼介紹的非常詳細,對大家具有一定的參考學習價值,需要的朋友們下面跟著小編一起來學習學習吧。2017-06-06
Spring Security使用多種加密方式進行密碼校驗的代碼示例
在Web應用中,密碼的安全存儲和驗證是至關重要的,本文將通過一個具體的代碼示例,介紹和總結如何在Spring Security中使用多種加密方式進行密碼校驗,文中通過代碼講解得非常詳細,需要的朋友可以參考下2024-06-06
SpringBoot測試之@SpringBootTest與MockMvc的實戰(zhàn)應用小結
本文將深入探討SpringBoot測試中兩個核心工具:@SpringBootTest注解與MockMvc測試框架的實戰(zhàn)應用,幫助開發(fā)者構建更穩(wěn)健的測試體系,提高代碼質量與可維護性,感興趣的朋友一起看看吧2025-03-03
Java?SpringBoot整合shiro-spring-boot-starterqi項目報錯解決
這篇文章主要介紹了Java?SpringBoot整合shiro-spring-boot-starterqi項目報錯解決,文章圍繞主題展開詳細的內容介紹,具有一定的參考一下2022-08-08

