首頁 > 軟體

Java通過MySQL的加解密函數實現敏感欄位儲存

2022-03-01 10:00:45

java通過mysql的加解密函數實現敏感欄位儲存

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.實現效果:

java工具類加解密和mysql的加解密效果是一樣的。

知識點補充

mysql下的加密函數有如下幾個

PASSWORD():建立一個經過加密的密碼字串,適合於插入到MySQL的安全系

統。該加密過程不可逆,和unix密碼加密過程使用不同的演演算法。主要用於MySQL的認證系統。

ENCRYPT(,):使用UNIX crypt()系統加密字串,ENCRYPT()函數接收要加密的字串和(可選的)用於加密過程的salt(一個可以唯一確定口令的字串,就像鑰匙一樣),注意,windows上不支援

ENCODE(,)   DECODE(,):加密解密字串。該函數有兩個引數:被加密或解密的字串和作為加密或解密基礎的金鑰。Encode結果是一個二進位制字串,以BLOB型別儲存。加密成都相對比較弱

MD5():計算字串的MD5校驗和(128位元)

SHA5():計算字串的SHA5校驗和(160位元)

以上兩個函數返回的校驗和是16進位制的,適合與認證系統中使用的口令。

到此這篇關於Java通過MySQL的加解密函數實現敏感欄位儲存的文章就介紹到這了,更多相關Java敏感欄位儲存內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com