SSAFY 공통프로젝트 할 당시 다른 팀에 데이터베이스가 해킹 당하고 여러 사건, 사고들이 있어서 보안에 관련해서 많은 고민을 하였다.
문제는 application.yml
파일에 DB와 apikey와 같은 민감정보들이 github를 통해 올라가면 안된다는 점이었다.
우리 팀은 당시 application.yml
파일을 git ignore하고 mattermost 팀 채널을 통해 주고 받는 방법으로 해결하였다. 당시 application.yml
에 수정이 일어나면 팀원들에게 알리고 해당 파일을 다시 공유하면서 많은 불편함이 있었다.
spring cloud
를 공부하면서 spring cloud config
통해 yml 파일을 관리하는 방법을 알게되었고 다른 방법은 없을까 검색을 해보았다.
Jasypt
를 통해 프로퍼티 파일을 암호화할 수 있는 것을 알게된 후 적용할려고 한다.
https://github.com/ulisesbocchio/jasypt-spring-boot
인터넷에 많은 예제를 찾아보고 공식문서도 읽어보았다.
인터넷 예제들을 StringEncryptor
를 직접 빈으로 등록해서 사용하는 방법을 사용하는 예제가 많았다.
Jasypt
도 Springboot
의 AutoConfig
를 지원한다고 한다.
해당 속성을 가진 StringEncryptor을 자동으로 등록해준다고 한다.
→ 자동 구성으로 생성한 StringEncryptor를 사용할려고 하면 정체모를 오류가 생겨서 custom으로 StringEncryptor를 구성해줬다.
이유를 아시는 분은 댓글로 부탁드립니다 ㅠㅠ
jasypt.encryptor.password
를 먼저 등록해주어야 한다
jasypt:
encryptor:
password: ${JASYPT_PASSWORD}
StringEncryptor를 빈으로 등록해준다
JasyptConfig.class
package com.ssafy.aejimeongji.config;
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JasyptConfig {
private final String password;
public JasyptConfig(
@Value("${jasypt.encryptor.password}") String password
) {
this.password = password;
}
@Bean
public StringEncryptor jasyptStringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(password);
config.setAlgorithm("PBEWithMD5AndDES");
config.setKeyObtentionIterations("1000");
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
}
}
@EnableEncryptableProperties
를 추가하면 @Value
나 Enviorment
객체에 접근할 때 복호화된 결과를 바로 받을 수 있다고 되어있다.스프링 property를 등록할 때 ENC(”암호화한 값”)
이러한 방법으로 값을 넣으면 된다.
jasypt:
encryptor:
password: ${JASYPT_PASSWORD}
bean: jasyptStringEncryptor
test:
text: ENC(암호화한 값)
jasypt.encryptor.bean
에는 StringEncryptor의 빈의 이름을 등록하면 되는데 default 값이 jasyptStringEncryptor
라서 빈의 이름을 똑같이 생성한다면 생략해도 된다.해당 문서를 보면 대칭, 비대칭 암호화 모두 지원하는 것 같다.