Spring Framework/Spring Boot
[Spring Boot] application.yml 정보 암호화 (jasypt)
장쫄깃
2022. 10. 30. 18:00
728x90
들어가며
application.yml 이나 application.properties 파일에 DB 접속 정보 또는 키 값을 명시하는 경우 중요한 정보들이 외부로 유출되어 심각한 피해가 발생할 수 있다. 이를 해결하기 위해 해당 파일의 정보를 암호화하는 방법에 대해서 알아보려고 한다.
이번 게시글에서 사용할 라이브러리는 jasypt(Java Simplified Encryption) 이다.
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
728x90