본문 바로가기

IT/Spring

[SpringBoot] application.yml 값 암호화 하기 (jasypt)

 

application.yml 이나 application.properties 파일에 DB의 비밀번호 또는 키값을 명시해두는 경우가 있습니다.
문제는 중요한 값들이 외부로 노출되어 보안에 심각한 문제를 초래할 수 있다는 점입니다.
이를 해결하기 위해 보안에 민감한 값들을 암호화시켜 저장해야 합니다.

 

1. Jsaypt(Java Simplified Encryption)

Jasypt는 특정 값을 암호화해주는 라이브러리 입니다. 자세한 내용은 아래 링크를 참조해주세요.
http://www.jasypt.org/

 

2. DB의 url, username, password를 암호화하기

테스트는 SpringBoot 2.2.2.RELEASE에서 진행했습니다.

1) pom.xml

...
        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>
...

 

2) JasyptConfig.java 작성

import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JasyptConfig {

    @Bean(name = "jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {

        String key = "my_jasypt_key";
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(key); // 암호화할 때 사용하는 키
        config.setAlgorithm("PBEWithMD5AndDES"); // 암호화 알고리즘
        config.setKeyObtentionIterations("1000"); // 반복할 해싱 회수
        config.setPoolSize("1"); // 인스턴스 pool
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); // salt 생성 클래스
        config.setStringOutputType("base64"); //인코딩 방식
        encryptor.setConfig(config);
        return encryptor;
    }
}
jasyptStringEncryptor로 Bean을 등록합니다. 이 이름은 application.yml의 jasypt bean으로 등록할 때 사용합니다.

 

3) DB 값들을 미리 암호화하기

application.yml에 암호화된 값을 적어주기 전에 미리 해당 값들을 암호화 해두어야 합니다.
@SpringBootTest
class JasyptApplicationTests {

    @Test
    void contextLoads() {
    }

    @Test
    void jasypt() {
        String url = "my_db_url";
        String username = "my_db_username";
        String password = "my_db_password";

        System.out.println(jasyptEncoding(url));
        System.out.println(jasyptEncoding(username));
        System.out.println(jasyptEncoding(password));
    }

    public String jasyptEncoding(String value) {

        String key = "my_jasypt_key";
        StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
        pbeEnc.setAlgorithm("PBEWithMD5AndDES");
        pbeEnc.setPassword(key);
        return pbeEnc.encrypt(value);
    }

}
//암호화된 값
GE1npS9T7z/GOqwcRLBPMbUSGQzj+WgSNCFvH5PoU83Z6ljps9ninis4P+4WNxBNz/RNhOrmReM= GFHmfIqHmrTaME93hLZqgg==
oBMaRuMSZyJDmebXacU8Vg==

 

4) application.yml 설정

spring:
  datasource:
    url: ENC(GE1npS9T7z/GOqwcRLBPMbUSGQzj+WgSNCFvH5PoU83Z6ljps9ninis4P+4WNxBNz/RNhOrmReM=)
    username: ENC(GFHmfIqHmrTaME93hLZqgg==)
    password: ENC(oBMaRuMSZyJDmebXacU8Vg==)
    
jasypt:
  encryptor:
    bean: jasyptStringEncryptor
jasyptStringEncryptor를 jasypt bean으로 등록하고, 각 속성값에 ENC( 암호화 값 ) 형식으로 입력해줍니다. 

이후 spring boot를 구동하면 잘 작동되는 것을 볼 수 있습니다.