Spring Framework/Spring Boot

[Spring Boot] application.yml 정보 암호화 (jasypt)

장쫄깃 2022. 10. 30. 18:00
728x90


들어가며


application.yml 이나 application.properties 파일에 DB 접속 정보 또는 키 값을 명시하는 경우 중요한 정보들이 외부로 유출되어 심각한 피해가 발생할 수 있다. 이를 해결하기 위해 해당 파일의 정보를 암호화하는 방법에 대해서 알아보려고 한다.

 

이번 게시글에서 사용할 라이브러리는 jasypt(Java Simplified Encryption) 이다.

참조 : http://www.jasypt.org/

 

Jasypt: Java simplified encryption - Jasypt: Java simplified encryption - Main

Jasypt 1.9.3 RELEASED! (May 25th, 2019) [DOWNLOAD and ChangeLogs] [WHAT'S NEW IN JASYPT 1.9] Java Simplified Encryption Jasypt is a java library which allows the developer to add basic encryption capabilities to his/her projects with minimum effort, and wi

www.jasypt.org

 

 

1. build.gradle


build.gradle에 jasypt 의존성을 추가한다.

// yaml 암호화
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4'

 

 

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 {
    private final static String ENC_KEY = "my_jasypt_key";

    @Bean(name = "jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(ENC_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. 정보 미리 암호화하기


import com.jdh.resourceEnvTest.config.JasyptConfig;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.junit.jupiter.api.Test;

public class JasyptTests {

    private final static String ENC_KEY = "my_jasypt_key";

    @Test
    public void 정보_암호화() {
        String url = "jdbc:log4jdbc:mysql://localhost:3306/test_master?characterEncoding=UTF-8";
        String username = "root";
        String password = "1234";

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

    public String jasyptEncoding(String value) {
        StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
        pbeEnc.setAlgorithm("PBEWithMD5AndDES");
        pbeEnc.setPassword(ENC_KEY);
        return pbeEnc.encrypt(value);
    }
}

 

테스트 코드를 이용하여 정보들을 미리 암호화 후 출력한다. 해당 게시글에선 DB 접속 정보를 암호화하였다.

 

<결과>

Mod8z09VHiWZxLPPYuDmYxSnQ13XosW95fjkC4XkbMPA7KVn2qo0o/49ASfT++n4VngHjp7Eyv/PtTGB0GURUFaMBUmRf4EEmyvNUwn8SztpbguVqu6yQA==
yMjOetLbZwUZ9DXzjB3hhA==
H43PcrwkPVRuboqddaE5lQ==

 

 

4. application.yml 설정


spring:
  datasource:
    hikari:
      driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy
      jdbc-url: ENC(Xv7atMv6K+SXVZpbo7OwNV5jLzGkhfh/NH5vxhd2sGXnPRrO1LD7byFKK1InjmU6vHyNGPxvAJSiZNniYhQblSmwO4eI9DyAD0r0/1Fvp9TAcKPYfJMWXA==)
      username: ENC(P/p8z2o3/ek1k+ygEcn5Sw==)
      password: ENC(d6xZmnANF7yn+N165RicDw==)

logging:
  level:
    web: info
    root: info
    com.jdh.resourceEnvTest: info

jasypt:
  encryptor:
    bean: jasyptStringEncryptor

 

jasyptStringEncryptor를 jasypt bean으로 등록하고 각 정보를 ENC(암호화 값) 형식으로 입력한다.

 

관련 소스 코드는 깃허브를 참고하면 된다.

링크 : https://github.com/JangDaeHyeok/sprint_resource_env_practice

 

GitHub - JangDaeHyeok/sprint_resource_env_practice: spring boot resource 환경 설정 나누기

spring boot resource 환경 설정 나누기. Contribute to JangDaeHyeok/sprint_resource_env_practice development by creating an account on GitHub.

github.com

 

728x90