From 0407747bdd884811dad0c56d9fb9b0b705d185db Mon Sep 17 00:00:00 2001 From: Rinjae Date: Thu, 25 Sep 2025 20:23:27 +0900 Subject: [PATCH] =?UTF-8?q?safedb=20=EB=94=94=EB=B2=84=EA=B9=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../eactive/ext/kjb/safedb/SafeDBFaker.java | 25 +++++++++++++------ .../eactive/ext/kjb/safedb/SafeDBWrapper.java | 3 +-- .../kjb/safedb/test/SafeDbWrapperTest.java | 4 +++ 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/eactive/ext/kjb/safedb/SafeDBFaker.java b/src/main/java/com/eactive/ext/kjb/safedb/SafeDBFaker.java index fbc6135..bc9b733 100644 --- a/src/main/java/com/eactive/ext/kjb/safedb/SafeDBFaker.java +++ b/src/main/java/com/eactive/ext/kjb/safedb/SafeDBFaker.java @@ -1,23 +1,29 @@ package com.eactive.ext.kjb.safedb; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.Base64Utils; + import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.util.Arrays; import java.util.Base64; /** * SafeDBFaker provides a fake encryption method for testing purposes when the real SafeDB library is not available. */ +@Slf4j public abstract class SafeDBFaker { private static final String AES_256_KEY = "1234567890123456" + "1234567890123456"; + private static final byte[] IV = "1234567890123456".getBytes(); public byte[] encrypt(String userId, String table, String column, byte[] data) { if (SafeDBColumns.PSWD.isEqualsIgnoreCase(column)) { // SHA256 + Base64 인코딩된 가짜 비밀번호 반환 return sha256(data); - //return sha256Base64(data); } else { // AES256 암호화된 가짜 데이터 반환 return aes256Encrypt(data); @@ -51,9 +57,9 @@ public abstract class SafeDBFaker { // AES256 암호화 private byte[] aes256Encrypt(byte[] data) { try { - Cipher cipher = javax.crypto.Cipher.getInstance("AES"); + Cipher cipher = javax.crypto.Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec keySpec = new javax.crypto.spec.SecretKeySpec(AES_256_KEY.getBytes(), "AES"); - cipher.init(javax.crypto.Cipher.ENCRYPT_MODE, keySpec); + cipher.init(Cipher.ENCRYPT_MODE, keySpec, new IvParameterSpec(IV)); return cipher.doFinal(data); } catch (Exception e) { throw new RuntimeException("Error during AES encryption", e); @@ -66,20 +72,23 @@ public abstract class SafeDBFaker { private byte[] aes256Decrypt(byte[] encryptedData) { try { - Cipher cipher = javax.crypto.Cipher.getInstance("AES"); + Cipher cipher = javax.crypto.Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec keySpec = new javax.crypto.spec.SecretKeySpec(AES_256_KEY.getBytes(), "AES"); - cipher.init(javax.crypto.Cipher.DECRYPT_MODE, keySpec); + cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(IV)); + log.debug("encryptedData : {}", Arrays.toString(encryptedData)); + log.debug("encryptedData toString() : {}", new String(encryptedData)); return cipher.doFinal(encryptedData); } catch (Exception e) { throw new RuntimeException("Error during AES decryption", e); } } - public String encryptString(String safedb, String s, String notRnno, String data) { - return new String(this.encrypt(safedb, s, notRnno, data.getBytes())); + public String encryptString(String userId, String table, String column, String data) { +// return new String(this.encrypt(safedb, s, notRnno, data.getBytes())); + return Base64Utils.encodeToString(this.encrypt(userId, table, column, data.getBytes())); } protected String decryptString(String userId, String table, String column, String data) { - return new String(this.decrypt(userId, table, column, data.getBytes())); + return new String(this.decrypt(userId, table, column, Base64Utils.decodeFromString(data))); } } diff --git a/src/main/java/com/eactive/ext/kjb/safedb/SafeDBWrapper.java b/src/main/java/com/eactive/ext/kjb/safedb/SafeDBWrapper.java index 929dad8..e67d4fb 100644 --- a/src/main/java/com/eactive/ext/kjb/safedb/SafeDBWrapper.java +++ b/src/main/java/com/eactive/ext/kjb/safedb/SafeDBWrapper.java @@ -8,7 +8,6 @@ import org.springframework.data.repository.init.ResourceReader; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; -import java.util.Base64; @Slf4j public class SafeDBWrapper extends SafeDBBroker { @@ -104,7 +103,7 @@ public class SafeDBWrapper extends SafeDBBroker { throw new SafeDBWrapperSdkException("[SafeDBWrapper] Encrypt error: " + e.getMessage(), e); } } else { - return this.encryptString(userId, tables, column, data); + return super.encryptString(userId, tables, column, data); } } diff --git a/src/test/java/com/eactive/ext/kjb/safedb/test/SafeDbWrapperTest.java b/src/test/java/com/eactive/ext/kjb/safedb/test/SafeDbWrapperTest.java index 92d6e85..863cba5 100644 --- a/src/test/java/com/eactive/ext/kjb/safedb/test/SafeDbWrapperTest.java +++ b/src/test/java/com/eactive/ext/kjb/safedb/test/SafeDbWrapperTest.java @@ -42,14 +42,18 @@ public class SafeDbWrapperTest { for (int len = 1; len <= 255; len++) { String originalData = repeat("A", len); // JDK8 호환 반복 문자열 try { + log.debug("OriginalData: {}", originalData); + // 암호화 (Base64 인코딩 결과 가정) String encryptedData = wrapper.encryptNotRnnoString(originalData); + log.debug("Encrypted Data: {}", encryptedData); // 예상 암호문 길이 계산 int expectedLen = getExpectedCipherLength(len, true); // 복호화 String decryptedData = wrapper.decryptNotRnno(encryptedData); + log.debug("Decrypted Data: {}", decryptedData); assertEquals(originalData, decryptedData, "Decrypted data does not match original at plain length=" + len); // 로그 출력