Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- mybatis
- SQL
- 스프링 시큐리티
- 관점지향프로그래밍
- Spring Security
- 스프링부트
- spring boot
- Redis
- network
- 객체지향프로그래밍
- request
- http
- java
- OOP
- response
- git
- Filter
- 디자인패턴
- 인터셉터
- 스프링
- Spring
- Interceptor
- aspect
- 자바
- RestControllerAdvice
- proxy pattern
- aop
- exception
- MYSQL
- 트랜잭션
Archives
- Today
- Total
장쫄깃 기술블로그
[Spring Boot] application.yml 정보 암호화 (jasypt) 본문
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
'Spring Framework > Spring Boot' 카테고리의 다른 글
[Spring Boot] Service에서 다른 Service 의존에 대하여 (3) | 2023.04.26 |
---|---|
[Spring Boot] 다중 데이터베이스 사용하기 (8) | 2023.01.16 |
[Spring Boot] 개발-운영 환경 resource 나누기 (Gradle) (2) | 2022.10.30 |
[Spring Boot] @RestControllerAdvice 를 사용한 예외 처리 (2) | 2022.09.25 |
[Spring Boot] @RestControllerAdvice 란 (2) | 2022.09.25 |