Java & Spring

H2 테스트DB에 mysql 함수 인식불가 에러

닥치고개돌 2023. 11. 7. 13:46
728x90

회사라 짧게 글씀

 

상황: 컬럼값이 암호화 되어 들어가는데 like검색해야함

querydsl 사용하여 날쿼리로 작성하지 못하고있는데

 AES_DECRYPT(UNHEX(d.number), 'secretKEY')

이런식으로 검색이 돼야했음

 

그래서 잘~ 작성하고 테스트 돌렷는데 

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Function "AES_DECRYPT" not found;

이렇게 에러가 발생

 

h2테스트 디비에 해당 함수가 없어서 발생, 자바코드로 연결해주는 방법이 있다.

다른건 못찾아봄

 

 

시원~하게 전체코드 간다

package coma.aaa.bbb.global.common;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;

public class H2Function {

    public static String AES_ENCRYPT(String data, String secretKey) {
        try {
            Key key = new SecretKeySpec(secretKey.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, key);
            byte[] encryptedBytes = cipher.doFinal(data.getBytes("UTF-8"));
            return DatatypeConverter.printHexBinary(encryptedBytes);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public static String AES_DECRYPT(String encryptedData, String secretKey) {
        try {
            Key key = new SecretKeySpec(secretKey.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, key);
            byte[] encryptedBytes = DatatypeConverter.parseHexBinary(encryptedData);
            byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
            return new String(decryptedBytes, "UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    public static String HEX(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(0xFF & b);
            if (hex.length() == 1) {
                hexString.append('0');
            }
            hexString.append(hex);
        }
        return hexString.toString();
    }

    public static byte[] UNHEX(String hex) {
        int len = hex.length();
        if (len % 2 != 0) {
            throw new IllegalArgumentException("Invalid hexadecimal string");
        }

        byte[] result = new byte[len / 2];
        for (int i = 0; i < len; i += 2) {
            result[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4) + Character.digit(hex.charAt(i + 1), 16));
        }

        return result;
    }
}

 

 

H2Function.java만들어주고

 

CREATE ALIAS IF NOT EXISTS AES_ENCRYPT FOR "com.aaa.bbb.global.common.H2Function.AES_ENCRYPT";
CREATE ALIAS IF NOT EXISTS AES_DECRYPT FOR "com.aaa.bbb.global.common.H2Function.AES_DECRYPT";
CREATE ALIAS IF NOT EXISTS HEX FOR "com.aaa.bbb.global.common.H2Function.HEX";
CREATE ALIAS IF NOT EXISTS UNHEX FOR "com.aaa.bbb.global.common.H2Function.UNHEX";

 

위에처럼 insert문 들어가는곳에 넣어주면 됨.

경로는 copyPath사용해서 넣고 /를 . 으로 해야함

경로 잘맞춰주면 잘됨

 

 

 

위에 함수 이외의 추가 함수들은 gpt가 더 잘만들어주니 바로검색하면된다.

 

querydsl로 암호화된 컬럼의 like절 검색하는건 추가로 올리겠다~

별거 아닌거같지만 @Converter가 걸려있어서 개답답했었음.

728x90

'Java & Spring' 카테고리의 다른 글

java8 람다 표현식  (0) 2024.03.01
자바 모니터링 설정  (0) 2024.01.30
java maven을 gradle로 변환  (0) 2023.09.24
java LinkedList 정리  (0) 2021.08.21
java ArrayList 정리  (0) 2021.08.21