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를 구동하면 잘 작동되는 것을 볼 수 있습니다.
'IT > Spring' 카테고리의 다른 글
[Retrofit] Retrofit을 이용해서 다양한 방식으로 API 요청을 해보자 (0) | 2022.02.05 |
---|---|
[SpringBoot] resource 값을 자바 소스에서 활용하기 (0) | 2021.07.19 |
[SpringBoot] HATEOAS 적용하기 (0) | 2021.06.17 |
[SpringBoot] H2 데이터베이스 사용하기 (0) | 2021.06.17 |
[SpringBoot] 이메일 전송 (Gmail SMTP Server) (2) | 2021.04.30 |