반응형

양방향 암호화 중 하나인 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

+ Recent posts