본문 바로가기

Tech/Spring

Springboot 프로젝트에서 Jasypt 암호화로 yml 설정 파일 프로퍼티 관리하기

 🚩목차

    개요

     스프링부트 프로젝트 내 application.yml application.properties 등 프로젝트 설정 파일을 관리하다 보면, 외부에 노출되어서는 안되는 값들이 생기기 마련입니다. 설정 파일 프로퍼티를 노출하지 않는 방법은 다양하지만 이번 포스팅에서는 Jasypt 암호화를 다루고자 합니다.

     

    Jasypt 라이브러리

    Jasypt 란?

     Jasypt는 Java Simplified Encryption의 약자로, 암호화 지식 없이도 자바 애플리케이션에 암호화 기능을 쉽게 추가할 수 있도록 도와주는 라이브러리입니다. dependency를 추가하고 Configuration 클래스만 작성하면 간단히 사용할 수 있습니다.

     

    Jasypt 적용하기

    1. dependency

    https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter

    현재 작성일(24.05.07) 기준 최신 버전은 3.0.5입니다.

    implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'
    <dependency>
        <groupId>com.github.ulisesbocchio</groupId>
        <artifactId>jasypt-spring-boot-starter</artifactId>
        <version>3.0.5</version>
    </dependency>

     

    2. Configuration 설정 클래스

    https://github.com/ulisesbocchio/jasypt-spring-boot#use-you-own-custom-encryptor

    @Configuration
    @EnableEncryptableProperties
    public class JasyptConfig {
        
        @Value("${jasypt.encryptor.private-key-string}")
        private String KEY;
        
        @Bean("jasyptStringEncryptor")
        public StringEncryptor stringEncryptor() {
    
            PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
            SimpleStringPBEConfig config = new SimpleStringPBEConfig();
    
            config.setPassword(KEY);
            config.setAlgorithm("PBEWithMD5AndDES");
            config.setKeyObtentionIterations("1000");
            config.setPoolSize("1");
            config.setProviderName("SunJCE");
            config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
            config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
            config.setStringOutputType("base64");
            encryptor.setConfig(config);
            
            return encryptor;
        }
    }

     config.setPassword("암호화 키") 메서드로 key를 지정할 수 있습니다. key 값이 외부에 노출되면 누구나 복호화 할 수 있기 때문에 애플리케이션을 실행할 때 외부에서 주입받을 것입니다.

     

    3. 프로퍼티 암호화

    https://www.devglan.com/online-tools/jasypt-online-encryption-decryption

    위 링크에서 암호화 할 기본 텍스트와 secret key를 작성하고, Two Way Encryption을 진행합니다. Encrypted String에 결과로 출력된 문자열을 Springboot yml 설정 파일에 ENC(문자열) 형태로 작성하면 됩니다.

    https://www.devglan.com/online-tools/jasypt-online-encryption-decryption

    spring:
      datasource:
        url: jdbc:h2:mem:testdb;MODE=MySQL
        driverClassName: org.h2.Driver
        username: sa
        password: password
    spring:
      datasource:
        url: ENC(6A/yQlMJeCBL3USJDPs8Tlypto5v0Rx7gKYBQ3GF+z0SqXGRt+zB1Q==)
        driverClassName: org.h2.Driver
        username: ENC(Fv6Hf38RIZ5N/EJMX+rWtQ==)
        password: ENC(hKAwFRY2oS5da1dWBRM1HwBWW2en08Oc)

     

    4. jasypt secret key 외부에서 주입하기

     Jasypt secret key가 외부에 노출되면, 누구나 키 값으로 복호화 해 민감 정보를 유추할 수 있습니다. 따라서 2번의 Configuration 설정 클래스 처럼 @Value 애너테이션으로 프로퍼티 값을 가져와야 합니다.

     

    1. 직접 명령줄로 .jar 파일을 실행할 경우 --jasypt.encryptor.private-key-string=password 옵션을 통해 전달할 수 있습니다.

    java -jar --jasypt.encryptor.private-key-string=password app.jar

     

    2. 환경변수로 프로퍼티 값을 주입할 경우 yml 설정 파일의 property 값에 ${ENV} 형식으로 작성합니다. 이후 배포 환경(Docker, EC2 등)에서 환경변수를 설정하면 됩니다. 

    jasypt:
      encryptor:
        private-key-string: ${JASYPT_KEY}
        algorithm: ${JASYPT_ALGORITHM}

     

    IntelliJ에서 위 환경변수를 테스트 할 경우 Edit Configurations > Modify options > Operating System > Environment variables를 클릭하고, VAR1=value; VAR2=value 형식으로 환경변수를 작성하면 됩니다.

    Edit Configurations
    Modify options > Operating System > Environment variables

     

    Reference