[Spring Boot] Jasypt를 이용한 설정 파일 암호화

김찬미·2024년 7월 23일
0

Spring Boot

목록 보기
1/7

🔐 Jasypt이란?

Jasypt (Java Simplified Encryption)Java 애플리케이션에서 암호화와 복호화를 간편하게 처리할 수 있도록 돕는 라이브러리이다. 민감한 정보를 안전하게 보호하기 위해 설계된 JasyptSpring Boot와 쉽게 통합할 수 있어 개발자들에게 매우 유용하다.

🗒️ 주요 개념

1) 암호화 (Encryption)

암호화는 데이터를 읽을 수 없는 형태로 변환하는 과정이다. 이는 데이터를 보호하고 무단 접근을 방지하는 데 사용된다. 암호화된 데이터는 알고리즘비밀 키를 사용하여 변환된다.

  • 목적: 데이터의 기밀성 유지, 불법 접근으로부터 보호한다.
  • 활용: 사용자의 비밀번호를 암호화하여 데이터베이스에 저장한다.

2) 복호화 (Decryption)

복호화는 암호화된 데이터를 원래의 읽을 수 있는 형태로 복원하는 과정이다. 암호화에 사용된 알고리즘과 비밀 키가 필요하다.

  • 목적: 암호화된 데이터를 다시 원래 상태로 복원하여 사용한다.
  • 활용: 로그인 시 사용자가 입력한 비밀번호를 복호화하여 데이터베이스에 저장된 암호화된 비밀번호와 비교한다.

3) 비밀 키 (Secret Key)

비밀 키는 암호화와 복호화에 사용되는 중요한 요소이다. 키가 노출되면 암호화된 데이터가 쉽게 해독될 수 있기 때문에, 비밀 키는 안전하게 관리해야 한다.

  • 목적: 암호화와 복호화의 핵심 요소로, 데이터의 안전성을 보장한다.
  • 관리: 환경 변수, 비밀 관리 시스템 등을 통해 안전하게 관리한다.

4) 알고리즘 (Algorithm)

암호화 알고리즘은 데이터를 암호화하고 복호화하는 데 사용되는 수학적 규칙을 정의한 것이다. 각 알고리즘은 특정한 암호화 방식과 키 길이를 사용하여 데이터를 변환한다.

  • 목적: 특정한 암호화 방식으로 암호화와 복호화를 처리한다.
  • 관리: 개발하는 애플리케이션의 보안 요구 수준에 맞게 선택한다.

🔍 Jasypt의 주요 기능

1) 자동 암호화/복호화

JasyptSpring Boot와 통합되어 애플리케이션 설정 파일에서 자동으로 암호화된 값을 처리할 수 있다. 설정 파일에서 암호화된 값을 읽고 자동으로 복호화하여 사용할 수 있다.

2) 다양한 알고리즘 지원

Jasypt는 다양한 암호화 알고리즘을 지원한다. 따라서 개발자는 애플리케이션의 보안 요구 사항에 맞는 알고리즘을 선택할 수 있다.

이름성능용도특징
PBEWithMD5AndDES낮음구형 시스템, 낮은 보안 요구 사항MD5 해시와 DES 암호화를 사용. 보안 강도가 낮아 현대 보안 요구 사항에 부족할 수 있음
PBEWithSHA1AndDESede중간중간 수준의 보안 요구 사항SHA-1 해시와 DESede(Triple DES) 암호화를 사용. DES에 비해 보안 강도가 강화됨
PBEWithSHA256AndAES_256높음높은 보안 요구 사항SHA-256 해시와 AES 256비트 암호화를 사용. 매우 강력한 보안을 제공하며 현대 보안 표준을 충족

3) 간편한 통합

JasyptSpring 기반 애플리케이션와 쉽게 통합되며, 간단한 설정으로 다양한 곳에서 암호화 기능을 사용할 수 있다.

  • Hibernate 통합: JasyptHibernate와 통합하면 데이터베이스의 민감한 정보를 자동으로 암호화 및 복호화할 수 있다. AttributeConverter를 사용하여 엔티티 필드에 암호화 로직을 쉽게 적용할 수 있다.

  • Spring Security 통합: JasyptSpring Security와 통합하여 비밀번호와 같은 민감한 정보를 안전하게 암호화하고 복호화할 수 있다. 커스텀 PasswordEncoder를 구현하여 보안 기능을 강화할 수 있다.


💻 Jasypt 적용하기

Jasypt의 기본적인 개념에 대해 다루었으니 이제 실제 Spring Boot 파일에 적용해 보자. 먼저, Jasypt의 실제 동작 단계에 대해 알아보자.

사전 설정

🔄️ Jasypt의 동작 단계

  1. 암호화 설정: SimpleStringPBEConfig 또는 PooledPBEStringEncryptor 클래스 등을 사용하여 암호화 설정을 구성한다. 비밀 키와 암호화 알고리즘을 설정한다.

  2. 암호화: 입력 데이터를 암호화한다. 이 과정에서는 비밀 키와 설정된 암호화 알고리즘을 사용하여 데이터를 암호화한다.

  3. 복호화: 암호화된 데이터를 복호화한다. 암호화와 동일한 비밀 키와 알고리즘을 사용하여 암호화된 데이터를 원래 형태로 복원한다.

🔑 환경 변수 설정 (Secret Key)

Jasypt에서 비밀 키 (Secret Key)는 유출되면 안되는 만큼 설정 파일에 직접 작성하기보단 PC나 IDE 등에서 따로 환경 변수를 설정하는 편이 좋다.

나같은 경우 IntelliJEdit Configurations에서 환경 변수를 설정해 주었다.

Environment variables를 정상적으로 설정했을 경우 사진과 같이 KEY=VALUE 형식이 된다.

🛠️ 의존성 추가

로그인 기능에서 필요한 의존성을 pom.xmldependencies에 추가한다.

Maven - pom.xml 파일에 추가

<dependencies>
	··· 생략 ···
        <!-- jasypt (데이터 암호화) -->
        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>
	··· 생략 ···
</dependencies>

Gradle - build.gradle 파일에 추가

implementation 'org.jasypt:jasypt:1.9.3'

코드 추가

📁 yml 또는 properties 파일 설정

jasypt:
  encryptor:
    password: ${ENCRYPT_KEY} # 환경 변수에서 가져옴
    algorithm: PBEWithMD5AndDES
    key-obtention-iterations: 1000
    pool-size: 1
    salt-generator-classname: org.jasypt.salt.RandomSaltGenerator
    iv-generator-classname: org.jasypt.iv.NoIvGenerator
    string-output-type: base64
  • password: 비밀 키를 의미, 여기선 환경 변수에서 설정한 값을 가져온다.

  • algorithm: 암호화 알고리즘을 설정한다.

    • 여기선 간단한 예제이므로 PBEWithMD5AndDES를 사용했지만 실제 애플리케이션에서는 더욱 복잡한 알고리즘을 사용하는 편이 좋다.

JasyptConfig 클래스 추가

@Configuration
public class JasyptConfig {

    @Bean("jasyptStringEncryptor")
    public PooledPBEStringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(System.getenv("ENCRYPT_KEY"));
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        return encryptor;
    }
}

Spring Boot 애플리케이션에서 Jasypt 설정을 읽어들여 암호화와 복호화를 자동으로 처리하도록 @Configuration 클래스를 추가한다.

@EnableEncryptableProperties 적용

@SpringBootApplication
@EnableEncryptableProperties
public class TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }

}

@EnableEncryptableProperties 어노테이션을 사용하면, 애플리케이션의 설정 파일에서 암호화된 값을 직접 읽어와 자동으로 복호화할 수 있다.


📝 마치며

Jasypt는 Java 애플리케이션에서 암호화와 복호화를 간편하게 처리할 수 있도록 돕는 강력한 도구이다. Spring Boot와 쉽게 통합되어 설정 파일의 민감한 정보를 안전하게 보호할 수 있으며, 다양한 암호화 알고리즘을 지원하여 애플리케이션의 보안 요구 사항에 맞는 설정이 가능하다.

Jasypt를 통해 민감한 정보를 보호하고 보안을 강화함으로써, 애플리케이션의 신뢰성을 높일 수 있다. 보안을 위해 앞으로 애플리케이션을 개발할 때 사용해 보자!

profile
백엔드 개발자

0개의 댓글

관련 채용 정보