ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] mysql aes_encrypt 를 java 코드로 만들기(AES 암호화)
    Java 2020. 7. 22. 01:25

    양방향 암호화 중 하나인 aes_encrypt 에 대해서 구현하겠습니다.

    AES 함수는 데이터를 암호화와 복호화를 할 수 있는 양방향 암호화 모듈입니다.

     

    mysql에 있는 기본 함수 aes_encrypt 로 암호화를 만드는 법과, 이에 따라 자바 코드에서도 암호화 및 복호화 할 수 있는 코드를 짜겠습니다.

    mysql 에 있는 암호화모듈을 java 코드에서 구현해야 할 시점도 있습니다.

    예를 들어 jpa 로 배치 insert 를 할 경우 db를 건건이 쿼리를 날리기도 번거롭고 말입니다.

     

    그래서 mysql 에서 사용하는 aes_encrypt(f_data,f_key) 에 대한 자바 코드입니다.

     

    select aes_encrypt("test", "key") 의 값은

    이값은 byte 값이다. String 으로 바꾸기 위해 

    select hex(aes_encrypt("test", "key")) 로 hex 도 추가합니다.

     

    자바 코드는

    public class CrypoUtil {
    
    
        /**
         *
         * @param key
         * @param text 암호화할 데이터
         */
        public static String encrypto(String key, String text) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException, BadPaddingException, IllegalBlockSizeException {
            final Cipher encryptCipher = Cipher.getInstance("AES");
            encryptCipher.init(Cipher.ENCRYPT_MODE, generateMySQLAESKey(key, "UTF-8"));
            String result = new String(Hex.encodeHex(encryptCipher.doFinal(text.getBytes("UTF-8")))).toUpperCase();
    
            return result;
        }
        
        /**
         * @param key
         * @param text 암호화 풀 데이터
         */
        public static String decrypto(String key, String text) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException, DecoderException {
            final Cipher decryptCipher = Cipher.getInstance("AES");
            decryptCipher.init(Cipher.DECRYPT_MODE, generateMySQLAESKey(key, "UTF-8"));
            String result = new String(decryptCipher.doFinal(Hex.decodeHex(text.toCharArray())));
    
            return result;
        }
        
        public static void main(String[] args) throws NoSuchPaddingException, BadPaddingException, NoSuchAlgorithmException, IllegalBlockSizeException, UnsupportedEncodingException, InvalidKeyException, DecoderException {
            String encrypTxt = encrypto("key", "test");
            System.out.println(encrypTxt);
            String decrypTxt = decrypto("key", encrypTxt);
            System.out.println(decrypTxt);
        }
    }

    여기서 주의 할 점은 encryptCipher.doFinal(text.getBytes("UTF-8")))) 이 값의 리턴값이 byte 라는 것입니다. 물론 mysql 에서도 aes_encrypt 도 byte 를 리턴해줘서 hex 로 변환해줘서 문자열로 변환해줘야 합니다,

    반응형

    'Java' 카테고리의 다른 글

    [java] java 로 gzip 압축 및 풀기  (0) 2020.08.10
    [자바] Intellij 에서 javadoc 문서 만들기  (0) 2020.06.02
    junit 사용  (0) 2020.05.08

    댓글

Designed by Tistory.