1. 암호화와 복호화

javax.crypto 패키지를 사용하여 문자열을 암호화하는 Java 예제를 아래에 제공합니다.

이 예제에서는 AES 암호화 알고리즘을 사용하여 문자열을 안전하게 암호화하고 복호화하는 방법을 보여줍니다.

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import java.security.SecureRandom;
import java.util.Base64;

public class StringEncrypter {
    // AES 암호화에 사용할 키를 생성합니다.
    public static SecretKey generateKey(int n) throws Exception {
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(n);
        return keyGenerator.generateKey();
    }

    // 초기화 벡터(IV)를 생성합니다.
    public static IvParameterSpec generateIv() {
        byte[] iv = new byte[16];
        new SecureRandom().nextBytes(iv);
        return new IvParameterSpec(iv);
    }

    // 문자열을 AES 암호화합니다.
    public static String encrypt(String algorithm, String input, SecretKey key, IvParameterSpec iv) throws Exception {
        Cipher cipher = Cipher.getInstance(algorithm);
        cipher.init(Cipher.ENCRYPT_MODE, key, iv);
        byte[] cipherText = cipher.doFinal(input.getBytes());
        return Base64.getEncoder().encodeToString(cipherText);
    }

    // AES로 암호화된 문자열을 복호화합니다.
    public static String decrypt(String algorithm, String cipherText, SecretKey key, IvParameterSpec iv) throws Exception {
        Cipher cipher = Cipher.getInstance(algorithm);
        cipher.init(Cipher.DECRYPT_MODE, key, iv);
        byte[] plainText = cipher.doFinal(Base64.getDecoder().decode(cipherText));
        return new String(plainText);
    }

    public static void main(String[] args) throws Exception {
        String input = "안녕하세요! 이것은 암호화될 메시지입니다.";
        SecretKey key = generateKey(128);
        IvParameterSpec iv = generateIv();

        String algorithm = "AES/CBC/PKCS5Padding";
        String cipherText = encrypt(algorithm, input, key, iv);
        String plainText = decrypt(algorithm, cipherText, key, iv);

        System.out.println("원본 메시지: " + input);
        System.out.println("암호화된 메시지: " + cipherText);
        System.out.println("복호화된 메시지: " + plainText);
    }
}

이 코드는 AES/CBC/PKCS5Padding 알고리즘을 사용하여 문자열을 암호화하고 복호화합니다.

generateKey 메소드는 AES 암호화에 사용될 키를 생성하고, generateIv 메소드는 초기화 벡터(IV)를 생성합니다.

encrypt 메소드와 decrypt 메소드는 각각 문자열을 암호화하고 복호화하는 데 사용됩니다.

main 메소드에서는 이 모든 과정을 실행하여 결과를 출력합니다.

암호화와 복호화 과정에서 사용되는 키와 IV는 매우 중요하므로 안전하게 관리해야 합니다.

또한, 암호화된 데이터는 Base64 인코딩을 사용하여 문자열로 변환되어 출력됩니다.

더 자세한 정보와 다른 암호화 모드에 대해서는 HowToDoInJava와 Baeldung에서 확인할 수 있습니다.

 

 

 

 

2. 데이터베이스에 SecretKey 인스턴스와 IvParameterSpec 인스턴스를 저장

SecretKey 인스턴스와 IvParameterSpec 인스턴스를 데이터베이스에 저장한 후에 추후 복호화에 사용하는 방법은 다음과 같습니다:

  1. 암호화 키와 IV 저장: SecretKey와 IvParameterSpec의 바이트 배열을 데이터베이스에 저장합니다.
    일반적으로 이러한 값들은 Base64 인코딩을 사용하여 문자열로 변환하여 저장합니다.

  2. 데이터베이스 구조: 암호화 키와 IV를 저장할 테이블을 생성합니다.
    예를 들어, encryption_keys라는 테이블에 id, secret_key, iv 컬럼을 만들 수 있습니다.

  3. 암호화 키와 IV 읽기: 복호화를 수행할 때, 데이터베이스에서 해당 SecretKey와 IvParameterSpec을 읽어와야 합니다.
    이를 위해 저장된 Base64 인코딩된 문자열을 다시 바이트 배열로 변환하고, 이를 사용하여 SecretKey와 IvParameterSpec 인스턴스를 재생성합니다.

  4. 복호화 수행: 재생성된 SecretKey와 IvParameterSpec을 사용하여 암호화된 데이터를 복호화합니다.

다음은 Java 코드 예시입니다:

import javax.crypto.spec.IvParameterSpec;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

// 데이터베이스에서 읽어온 Base64 인코딩된 키와 IV 문자열
String base64EncodedKey = "여기에_데이터베이스에서_읽어온_키를_넣으세요";
String base64EncodedIv = "여기에_데이터베이스에서_읽어온_IV를_넣으세요";

// Base64 문자열을 바이트 배열로 변환
byte[] decodedKey = Base64.getDecoder().decode(base64EncodedKey);
byte[] decodedIv = Base64.getDecoder().decode(base64EncodedIv);

// 바이트 배열을 사용하여 SecretKey와 IvParameterSpec 인스턴스를 생성
SecretKey originalKey = new SecretKeySpec(decodedKey, 0, decodedKey.length, "AES");
IvParameterSpec originalIv = new IvParameterSpec(decodedIv);

// 이제 originalKey와 originalIv를 사용하여 복호화를 수행할 수 있습니다.

보안 주의사항: 암호화 키와 IV는 매우 민감한 정보이므로, 데이터베이스에 저장할 때는 안전한 방법을 사용해야 합니다.

예를 들어, AWS Secrets Manager1와 같은 서비스를 사용하여 키 관리를 할 수 있습니다.

또한, 데이터베이스에 직접 저장하는 대신 애플리케이션의 구성 파일이나 환경 변수를 통해 관리하는 것도 고려해볼 수 있습니다.

이 방법을 사용하여 암호화 키와 IV를 안전하게 관리하면서 필요할 때 쉽게 복호화 작업을 수행할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

번호 제목 글쓴이 날짜 조회 수
공지 [계속 추가중] SBOM 용어 정의 황제낙엽 2025.04.10 21567
공지 [계속 추가중] Keycloak 용어 및 설정 옵션 정의 황제낙엽 2024.02.02 20407
146 SPDX 2.3, 계속 써도 되나요? — 3.0으로 넘어갈 때를 판단하는 실무 기준 황제낙엽 2026.08.11 55
145 같은 OSS 지만 여러 버전을 등록해야 하는 경우 황제낙엽 2026.04.24 1972
144 [FOSSLight Dependency Scanner] Android Project 의 Dependency Scan 을 위한 Android SDK 설치와 설정 황제낙엽 2026.04.23 1843
143 FOSSLight Hub 의 REST API 이용 (v2) 황제낙엽 2026.03.19 2500
142 [FOSSLight/검토용] 개발그룹의 sbom-info.yaml 분석 및 피드백 절차 황제낙엽 2026.03.16 1983
141 [FOSSLight/관리용] Project Identification 진행에서 최종 SBOM SPDX 문서 추출 황제낙엽 2026.02.09 1917
140 [FOSSLight] 'Download Location' 컬럼 값에 'Different from DB' 라는 푸른색 메세지가 출력 file 황제낙엽 2026.02.06 3613
139 [FOSSLight] Project Identification 진행시의 신규 OSS 등록 처리 방법 황제낙엽 2026.02.06 3750
138 [FOSSLight Hub] License 정보를 직접 등록시 필요한 항목 목록 황제낙엽 2026.02.06 3579
137 [FOSSLight Hub] Open Source 정보를 직접 등록시 필요한 항목 목록 황제낙엽 2026.02.06 3352
136 [OSS] Microsoft.Web.WebView2 황제낙엽 2026.02.06 3352
135 [FOSSLight] fosslight 프로젝트의 'Pre-Review' > 'Open Source' 팝업창의 세 버튼에 대한 용도 황제낙엽 2026.02.06 3573
134 [FOSSLight/검토용] prechecker convert 결과 Hub 등록후 Identification 처리 file 황제낙엽 2026.02.05 3289
133 python venv 설치, fosslight source scanner , binary scanner 설치, 버전 확인 황제낙엽 2026.02.02 3508
132 SPDX 템플릿 다운로드 및 온라인 변환기 황제낙엽 2026.01.22 3870
131 SBOM(Software Bill of Materials) 및 소프트웨어 공급망 보안 관련 주요 정부 기관 및 단체 황제낙엽 2026.01.22 3606
130 [FOSSLight] online guide link 황제낙엽 2026.01.14 1844
129 identification 에서 출력하는 warning, error 메세지 황제낙엽 2025.12.29 1428
128 sbom-info.yaml 을 이용한 dependency scan excel 작성 file 황제낙엽 2025.12.29 3578
127 binary scan 결과물에 대해 취약점이 없는데 왜 SBOM에 넣어야 하나? 황제낙엽 2025.12.17 3484