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 |