들어가기에 앞서...
진행중인 프로젝트에서 실배포까지 할 예정이기 때문에 DB정보와 같은 알려지면 위험한 설정들을 gitignore를 활용하여 배포하지 않거나, 암호화하여 올릴 필요가 생겼습니다.
Jasypt 라이브러리를 활용하면 Springboot 내에서 쉽게 암호화가 가능하다고 하여
실제 적용하는 과정에 대해서 기록합니다.
구축 환경
Springboot : 3.2.2
JDK : 17
Build Tool : gradle
Editor : InteliJ
dependency 의존성 추가
위 사이트에서 Jasypt를 검색하여 최신버전인 3.0.5 의존성 추가
3.0.4가 사용이 많이 되어 적용과정에서 한번 사용해봤는데 의존성 주입이 안된다는 이상한 에러가 발생하여 최신버전으로 수정...
JasyptConfig 설정 클래스 작성
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JasyptConfig {
@Value("${encryptor.key}")
String KEY;
private static final String ALGORITHM = "PBEWithMD5AndDES";
@Bean(name = "jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(KEY); //암호화 시 사용할 키 -> 이 키를 가지고 암호화 복호화 진행
config.setAlgorithm(ALGORITHM); //사용할 알고리즘
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;
}
}
암호화에 대한 설정파일을 작성하는 단게입니다.
주의깊게 보아야 할 점은 config.setPassword() 부분이며, 해당 설정은 암호화 시 사용할 key값을 지정하는 부분입니다.
해당 값을 그저 멤버변수로 등록하게 된다면 해당 설정파일이 배포되며 복호화할 수 있는 키를 주는 꼴과 다름없기에 환경변수로 설정하여 해당 부분도 감추어 주었습니다.
또한 해당 포스팅에서는 PBEWithMD5AndDES 알고리즘을 사용하였는데 Jasypt 3.0 버전 이후부터는 기존 알고리즘이 PBEWITHHMACSHA512ANDAES_256로 변경되었다고 합니다.
추가로 인텔리제이에서 환경변수를 등록하는 부분은 별도로 포스팅하도록 하곘습니다.
당장 테스트가 급하다고 생각되시면 해당 변수 부분에 특정 값으로 초기화하여 사용하셔도 무방합니다.
이제 암호화를 위한 설정은 모두 끝마쳤습니다.
실제로 암호화가 필요한 부분에 적용을 해보겠습니다.
Generate and Check Jasypt Encrypted Passwords Online (devglan.com)
테스트 파일을 별도로 작성하여 암호화된 값을 얻어올 수 도 있지만 조금 귀찮기 때문에 위 사이트를 참조하여 쉽게 암호화된 값을 얻어오도록 합시다.
root : Jasypt를 이용하여 암호화하고자 하는 중요한 설정 값의 원본
myPrivateKey : 위 설정파일에서 적용할 암호화를 위한 Key값
Encrypted String : 암호화된 값으로 프로젝트에서 사용하는 중요한 값들은 해당값으로 대치됩니다.
또한 Two Way Encryption(With Secret Text)를 택하여 KEY를 활용한 암호화 방식으로 진행하면 됩니다.
이제 application.properties에 있는 제 DB정보들을 암호화 해보겠습니다.
위와같이 암호화하여 얻은 값을 ENC를 통해 괄호로 감싸주어 표현해야지 컴파일 시 해당 값이 복호화가 필요한 암호화된 값이라는걸 인식하기 때문에 빼먹지 않도록 합시다.
최종적으로 DB연결이 잘 이루어져 에러없이 작동이 잘 되는 것을 확인하면서 Jasypt 적용법 정리를 마무리하도록 하겠습니다.
'Develop > SpringBoot' 카테고리의 다른 글
[Swagger] 스프링 3.x Swagger 적용(With. SpringDocs) (1) | 2024.01.31 |
---|---|
[SpringBoot] 웹소켓(WebSocket) (0) | 2024.01.31 |
[채팅 서버] Springboot + STOMP를 활용한 채팅 구현 (1) | 2024.01.26 |
[채팅 서버] STOMP, Message Broker (1) | 2024.01.24 |
[SpringBoot] 스프링부트 프로젝트 Jar파일 생성 (0) | 2024.01.09 |
개발 기술 블로그, Dev
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!