safedb 디버깅
This commit is contained in:
@@ -1,23 +1,29 @@
|
|||||||
package com.eactive.ext.kjb.safedb;
|
package com.eactive.ext.kjb.safedb;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.util.Base64Utils;
|
||||||
|
|
||||||
import javax.crypto.Cipher;
|
import javax.crypto.Cipher;
|
||||||
|
import javax.crypto.spec.IvParameterSpec;
|
||||||
import javax.crypto.spec.SecretKeySpec;
|
import javax.crypto.spec.SecretKeySpec;
|
||||||
import java.security.MessageDigest;
|
import java.security.MessageDigest;
|
||||||
import java.security.NoSuchAlgorithmException;
|
import java.security.NoSuchAlgorithmException;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Base64;
|
import java.util.Base64;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SafeDBFaker provides a fake encryption method for testing purposes when the real SafeDB library is not available.
|
* SafeDBFaker provides a fake encryption method for testing purposes when the real SafeDB library is not available.
|
||||||
*/
|
*/
|
||||||
|
@Slf4j
|
||||||
public abstract class SafeDBFaker {
|
public abstract class SafeDBFaker {
|
||||||
private static final String AES_256_KEY = "1234567890123456" + "1234567890123456";
|
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) {
|
public byte[] encrypt(String userId, String table, String column, byte[] data) {
|
||||||
if (SafeDBColumns.PSWD.isEqualsIgnoreCase(column)) {
|
if (SafeDBColumns.PSWD.isEqualsIgnoreCase(column)) {
|
||||||
// SHA256 + Base64 인코딩된 가짜 비밀번호 반환
|
// SHA256 + Base64 인코딩된 가짜 비밀번호 반환
|
||||||
return sha256(data);
|
return sha256(data);
|
||||||
//return sha256Base64(data);
|
|
||||||
} else {
|
} else {
|
||||||
// AES256 암호화된 가짜 데이터 반환
|
// AES256 암호화된 가짜 데이터 반환
|
||||||
return aes256Encrypt(data);
|
return aes256Encrypt(data);
|
||||||
@@ -51,9 +57,9 @@ public abstract class SafeDBFaker {
|
|||||||
// AES256 암호화
|
// AES256 암호화
|
||||||
private byte[] aes256Encrypt(byte[] data) {
|
private byte[] aes256Encrypt(byte[] data) {
|
||||||
try {
|
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");
|
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);
|
return cipher.doFinal(data);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new RuntimeException("Error during AES encryption", e);
|
throw new RuntimeException("Error during AES encryption", e);
|
||||||
@@ -66,20 +72,23 @@ public abstract class SafeDBFaker {
|
|||||||
|
|
||||||
private byte[] aes256Decrypt(byte[] encryptedData) {
|
private byte[] aes256Decrypt(byte[] encryptedData) {
|
||||||
try {
|
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");
|
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);
|
return cipher.doFinal(encryptedData);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new RuntimeException("Error during AES decryption", e);
|
throw new RuntimeException("Error during AES decryption", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public String encryptString(String safedb, String s, String notRnno, String data) {
|
public String encryptString(String userId, String table, String column, String data) {
|
||||||
return new String(this.encrypt(safedb, s, notRnno, data.getBytes()));
|
// 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) {
|
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)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import org.springframework.data.repository.init.ResourceReader;
|
|||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
import java.util.Base64;
|
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class SafeDBWrapper extends SafeDBBroker {
|
public class SafeDBWrapper extends SafeDBBroker {
|
||||||
@@ -104,7 +103,7 @@ public class SafeDBWrapper extends SafeDBBroker {
|
|||||||
throw new SafeDBWrapperSdkException("[SafeDBWrapper] Encrypt error: " + e.getMessage(), e);
|
throw new SafeDBWrapperSdkException("[SafeDBWrapper] Encrypt error: " + e.getMessage(), e);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return this.encryptString(userId, tables, column, data);
|
return super.encryptString(userId, tables, column, data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -42,14 +42,18 @@ public class SafeDbWrapperTest {
|
|||||||
for (int len = 1; len <= 255; len++) {
|
for (int len = 1; len <= 255; len++) {
|
||||||
String originalData = repeat("A", len); // JDK8 호환 반복 문자열
|
String originalData = repeat("A", len); // JDK8 호환 반복 문자열
|
||||||
try {
|
try {
|
||||||
|
log.debug("OriginalData: {}", originalData);
|
||||||
|
|
||||||
// 암호화 (Base64 인코딩 결과 가정)
|
// 암호화 (Base64 인코딩 결과 가정)
|
||||||
String encryptedData = wrapper.encryptNotRnnoString(originalData);
|
String encryptedData = wrapper.encryptNotRnnoString(originalData);
|
||||||
|
log.debug("Encrypted Data: {}", encryptedData);
|
||||||
|
|
||||||
// 예상 암호문 길이 계산
|
// 예상 암호문 길이 계산
|
||||||
int expectedLen = getExpectedCipherLength(len, true);
|
int expectedLen = getExpectedCipherLength(len, true);
|
||||||
|
|
||||||
// 복호화
|
// 복호화
|
||||||
String decryptedData = wrapper.decryptNotRnno(encryptedData);
|
String decryptedData = wrapper.decryptNotRnno(encryptedData);
|
||||||
|
log.debug("Decrypted Data: {}", decryptedData);
|
||||||
assertEquals(originalData, decryptedData, "Decrypted data does not match original at plain length=" + len);
|
assertEquals(originalData, decryptedData, "Decrypted data does not match original at plain length=" + len);
|
||||||
|
|
||||||
// 로그 출력
|
// 로그 출력
|
||||||
|
|||||||
Reference in New Issue
Block a user