[SpringBoot] 개인정보 암호화 및 복호화

EunJin
6 min readDec 26, 2022

--

한국인터넷진흥원(KISA)에서 제공하는 KISA_SEED_CBC 알고리즘 소스 코드 기준으로 작성했습니다.

회사에서 신규 프로젝트 진행 중, 유저 ID를 암호화하여 DB에 저장하는 API를 구현할 일이 생겼고, 기존 프로젝트의 암호화 방식을 채택하여 진행하게 되었습니다.

기존 프로젝트는 KISA_SEED_EBC 모드를 사용했지만 보안 취약점이 발견되어 KISA_SEED_CBC 모드로 사용하기로 했습니다.

아래는 KISA에서 제공하는 KISA_SEED_CBC 매뉴얼입니다.

위 매뉴얼을 참고하여 작성한 샘플 코드입니다.

(테스트 결과를 순차적으로 출력하기 위해 LinkedHashMap<>을 사용했습니다.)

@Override
public HashMap<String, Object> goLogin() {
HashMap<String, Object> map = new LinkedHashMap<>();

byte[] pbszUserKey = "testCrypt2020!@#".getBytes();
byte[] pbszIV = "1234567890123456".getBytes();

String userId = "A8000"; // 테스트 데이터

byte[] encryptedMessage = KISA_SEED_CBC.SEED_CBC_Encrypt(pbszUserKey, pbszIV, userId.getBytes(), 0, userId.getBytes().length);

map.put("암호화된 데이터", encryptedMessage.toString());

return map;
}

테스트 코드의 결과는 다음과 같습니다.

암호화 작업은 잘 되었지만, FE 쪽에서 Base64 인코딩을 원해서 코드를 조금 수정했습니다.

@Override
public HashMap<String, Object> goLogin() {
HashMap<String, Object> map = new LinkedHashMap<>();

byte[] pbszUserKey = "testCrypt2020!@#".getBytes();
byte[] pbszIV = "1234567890123456".getBytes();

String userId = "A8000"; // 테스트 데이터

byte[] encryptedMessage = KISA_SEED_CBC.SEED_CBC_Encrypt(pbszUserKey, pbszIV, userId.getBytes(), 0, userId.getBytes().length);

String userKey = new String(org.apache.commons.codec.binary.Base64.encodeBase64(encryptedMessage));

map.put("암호화된 데이터1", encryptedMessage.toString());
map.put("암호화된 데이터2", userKey);

return map;
}

유저 ID가 암호화되어 잘 넘어갑니다. 추가적으로 유저 아이디를 DB에 저장하지 않고, JSON으로만 넘겨달라는 요청을 받아 이 시점에 복호화 작업을 진행했습니다.

기존 코드에서 매뉴얼에 있는 복호화 코드(KISA_SEED_CBC.SEED_CBC_Decrypt)를 참고하여 추가했습니다.

Base64로 인코딩이 되어있던 값을 다시 디코딩하고 복호화를 진행했습니다.

@Override
public HashMap<String, Object> goLogin() {
HashMap<String, Object> map = new LinkedHashMap<>();

byte[] pbszUserKey = "testCrypt2020!@#".getBytes();
byte[] pbszIV = "1234567890123456".getBytes();

String userId = "A8000";

byte[] encryptedMessage = KISA_SEED_CBC.SEED_CBC_Encrypt(pbszUserKey, pbszIV, userId.getBytes(), 0, userId.getBytes().length);

String userKey = new String(org.apache.commons.codec.binary.Base64.encodeBase64(encryptedMessage));

map.put("암호화된 데이터", userKey);

byte[] encryptChar = org.apache.commons.codec.binary.Base64.decodeBase64(userKey);
byte[] decryptedMessage = KISA_SEED_CBC.SEED_CBC_Decrypt(pbszUserKey, pbszIV, encryptChar, 0, encryptChar.length);

String decryptUserKey = new String(decryptedMessage);

map.put("복호화된 데이터", decryptUserKey);

return map;
}

아래는 결과입니다. 암복호화 API가 정상적으로 구현 되었습니다.

--

--