728x90
프로젝트를 진행하다 보면 각종 민감한 Password와 같은 프로퍼티를 외부로부터 안전하게 보관해야 할 일이 많다. 실수로라도 Github에 업로드한다면 끔찍한 일이 벌어질 것이다... 이럴 때 사용할 수 있는 Jasypt 라이브러리 사용법에 대해 araboza
Jasypt는 자바 애플리케이션의 설정파일(application.yml, application.properties 등)을 암호화할 수 있도록 지원하는 라이브러리다. 암호화된 설정 파일은 애플리케이션의 버전관리 시스템에서 안전하게 관리할 수 다.
아래는 Jasypt를 사용하여 스프링 부트 애플리케이션에서 application.yml 파일의 값을 암호화하는 방법이다.
1. Jasypt 의존성 추가
build.gradle 파일에 아래와 같이 의존성을 추가한다.
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4'
2. JasyptConfig
JasyptConfig Jasypt를 사용하기 위한 설정을 담당한다.
키는 암호화에 사용되기 때문에 외부에 노출되서는 안 된다. 그래서 환경 변수 설정을 해주었다.
@Configuration
public class JasyptConfig {
@Value("${jasypt.encryptor.key}")
String key;
@Bean(name = "jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(key);
config.setAlgorithm("PBEWithMD5AndDES");
config.setKeyObtentionIterations("1000");
config.setPoolSize("1");
config.setProviderName("SunJCE");
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
config.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
}
}
- setPassword : 암호화 및 복호화에 사용할 비밀 키를 설정한다. 외부에 노출되어서는 안된다.
- setAlgorithm : 암호화에서 사용할 알고리즘을 설정한다.
- setKeyObtentionIterations : 암호화 키 생성 반복 횟수를 설정한다.
- setPoolSize : 암호화에서 사용할 스레드 풀 크기를 설정한다.
- setSaltGeneratorClassName : setStringOutputType : 암호화에서 생성된 문자열 출력 형식을 설정한다.
3. 로컬 환경에서 암호화 후 암호화한 값 확인
@SpringBootTest
class JasyptConfigTest {
@Test
void jasypt() {
String secret = "암호화하려는 값";
System.out.printf("%s -> %s", secret, jasyptEncoding(secret));
}
public String jasyptEncoding(String value) {
String key = "key";
StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
pbeEnc.setAlgorithm("PBEWithMD5AndDES");
pbeEnc.setPassword(key);
return pbeEnc.encrypt(value);
}
}
// ENC로 시작하는 것이 암호화된 값
secret -> ENC(7a9NSzNM7KRlnEW5/UmYcKvcDNrbah0tPTV43EzKUZ1xJi1objqQLUANPHdpp6rv)
4. application.yml 수정
application.yml 파일에 암호화할 값을 입력한다. 이때 값을 암호화하기 위한 키값도 함께 입력해야 한다.
위에서도 말했듯이 키는 암호화에 사용되기 때문에 외부에 노출되서는 안된다.
우리 Github Action을 통해 자동 배포를 했기 때문에 Github Action Secrets를 통해 key를 관리했다.
datasource:
username: ENC(znL2Q/f8+3bbOWdSK37yAA==)
password: ENC(fFvTO+X9nJGjrMxFzCJIOA==)
...
jasypt:
encryptor:
bean: jasyptStringEncryptor
key: ${key} # 노출되면 안됨!
728x90
'Spring' 카테고리의 다른 글
Spring - Spring initializr로 프로젝트 생성하기 (0) | 2023.03.22 |
---|---|
Spring - Thmbnail 이미지로 웹 성능 향상시키기 (0) | 2023.03.15 |
Spring - Spring으로 AWS S3에 이미지 업로드하기2: Spring에서 기능 구현 (0) | 2023.03.06 |
Spring Security - OAuth2와 JWT로 로그인 구현하기(Kakao, Google, Naver) (4) | 2023.03.05 |
Spring - Scheduler로 매일 자정 실행되는 로직을 짜보자 (0) | 2023.03.02 |