Java通過MySQL的加解密函數(shù)實(shí)現(xiàn)敏感字段存儲(chǔ)
java通過mysql的加解密函數(shù)實(shí)現(xiàn)敏感字段存儲(chǔ)
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)); } }
運(yùn)行main方法結(jié)果:
加密后:62b778a8ccaa40cce4c9e4e42c693665
解密后:1
2.mysql的sql加解密:
生成16隨機(jī)鹽:3532263592381276
select concat((SELECT CEILING(RAND()*9000000000000000+1000000000000000)),'');
加密:62B778A8CCAA40CCE4C9E4E42C693665
SELECT (HEX(AES_ENCRYPT(1,"3532263592381276")))
解密:1
SELECT AES_DECRYPT(UNHEX("62B778A8CCAA40CCE4C9E4E42C693665"),"3532263592381276")
3.實(shí)現(xiàn)效果:
java工具類加解密和mysql的加解密效果是一樣的。
知識(shí)點(diǎn)補(bǔ)充
mysql下的加密函數(shù)有如下幾個(gè)
PASSWORD():創(chuàng)建一個(gè)經(jīng)過加密的密碼字符串,適合于插入到MySQL的安全系
統(tǒng)。該加密過程不可逆,和unix密碼加密過程使用不同的算法。主要用于MySQL的認(rèn)證系統(tǒng)。
ENCRYPT(,):使用UNIX crypt()系統(tǒng)加密字符串,ENCRYPT()函數(shù)接收要加密的字符串和(可選的)用于加密過程的salt(一個(gè)可以唯一確定口令的字符串,就像鑰匙一樣),注意,windows上不支持
ENCODE(,) DECODE(,):加密解密字符串。該函數(shù)有兩個(gè)參數(shù):被加密或解密的字符串和作為加密或解密基礎(chǔ)的密鑰。Encode結(jié)果是一個(gè)二進(jìn)制字符串,以BLOB類型存儲(chǔ)。加密成都相對(duì)比較弱
MD5():計(jì)算字符串的MD5校驗(yàn)和(128位)
SHA5():計(jì)算字符串的SHA5校驗(yàn)和(160位)
以上兩個(gè)函數(shù)返回的校驗(yàn)和是16進(jìn)制的,適合與認(rèn)證系統(tǒng)中使用的口令。
到此這篇關(guān)于Java通過MySQL的加解密函數(shù)實(shí)現(xiàn)敏感字段存儲(chǔ)的文章就介紹到這了,更多相關(guān)Java敏感字段存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot使用redis進(jìn)行api防刷限流過程詳解
這篇文章主要介紹了Springboot使用redis進(jìn)行api防刷限流過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12Java?EasyExcel實(shí)現(xiàn)合并相同內(nèi)容單元格與動(dòng)態(tài)標(biāo)題功能
這篇文章主要為大家詳細(xì)介紹了Java?EasyExcel如何實(shí)現(xiàn)合并相同內(nèi)容單元格與動(dòng)態(tài)標(biāo)題功能,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考下2023-12-12