jasypt
- jasypt는 형상관리, 애플리케이션 배포시에 DB계정 및 중요한 비밀 키 값들을 평문으로 저장하는것을 막기 위해 프로퍼티를 암호화 할 수 있게 제공해주는 라이브러리 입니다.
사용법 및 설명
- 의존성(dependency) 추가
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version>
</dependency>
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4'
- @EnableEncryptableProperties 어노테이션을 통하여 SpringBoot 암호화할 빈을 생성해줄 class를 생성한다.

- Bean 이름을 지정해주 않게 되면 Default 빈 명칭은 jasyptStringEncryptor 사용한다
빈의 명칭을 변경하고 싶으면 ymal에 해당 빈 이름을 설정하여 클래스에서 빈 명칭을 설정해준다.
jasypt: encryptor: bean: #{빈 이름}
- 암호기를 만들때는 아래와 같은 옵션들을 지정할 수있다
Key Required Default Value jasypt.encryptor.password True - jasypt.encryptor.algorithm False PBEWITHHMACSHA512ANDAES_256 jasypt.encryptor.key-obtention-iterations False 1000 jasypt.encryptor.pool-size False 1 jasypt.encryptor.provider-name False SunJCE jasypt.encryptor.provider-class-name False null jasypt.encryptor.salt-generator-classname False org.jasypt.salt.RandomSaltGenerator jasypt.encryptor.iv-generator-classname False org.jasypt.iv.RandomIvGenerator jasypt.encryptor.string-output-type False base64 jasypt.encryptor.proxy-property-sources False false jasypt.encryptor.skip-property-sources False empty list
- 암호화 알고리즘
- 인코딩
- 솔트
- 기타
JasyptConfig 클래스
import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import lombok.extern.slf4j.Slf4j;
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
@EnableEncryptableProperties
@Slf4j
public class JasyptConfig {
@Value("${encryptor.key}")
private String password;
private final String ALGORITHM = "PBEWITHHMACSHA512ANDAES_256"; // HmacSHA512로 부터 생성된 키를 사용하여 데이터를 AES-256 알고리즘을 이용하여 암호화
private final int SALT = 3308;
private final int POOL_SIZE = 1;
private final String ENCODING = "base64";
@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor(){
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
config.setPassword(password); // 암호화 키
config.setAlgorithm(ALGORITHM); // 적용 알고리즘
config.setKeyObtentionIterations(SALT); // 해싱 반복 횟수
config.setPoolSize(POOL_SIZE); // 인스턴스 Pool 개수
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); // salt 생성
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator"); // IV 생성기
config.setStringOutputType(ENCODING); // 인코딩 방식
encryptor.setConfig(config);
return encryptor;
}
}
- 빈 이름은 @Bean("jasyptStringEncryptor") defualt 세팅을 했다.
- 이외 옵션들의 값을을 설정해주었다.
- 암호 알고리즘은 편의상 기본 값이 아닌 PBEWithMD5AndDES를 사용할 수 있으며 외부사이트를 통해 암호화 값을 생성 할 수 있다.
https://www.devglan.com/online-tools/jasypt-online-encryption-decryption
암호값 설정
- ymal 파일에 직접 해당 값을 세팅할 수있다.
- 필자는 vm option으로 전달받은 값을 세팅하게 만들었다.

-Dencryptor.key=qKqrSSqzxCcQYTjLMK5
-Dspring.datasource.url=ENC(YJ7o1Qjwj9huigdLvk3n1mNI5Q4Jn3DXUAgXLlDUZdQI4UGXj+EZ7rLugm79VgLGy7CY9F6dKxNTOMW5thEmHQ==)
-Dspring.datasource.username=ENC(e0L4EAherw6lORjxkpXPdR58fXb/kr6ziPB3ODetGdOcyXQ37rKuoUitJSaOzrgd)
-Dspring.datasource.password=ENC(G2o8K6pBO/EimMEwyLf1MzhtXTN+rafoSZEfWPAenjvta2L9eseB6ha/Yp7BID3F)
위 처럼 option으로 통해 암호화 값을 전달하여 처리하는 방식으로 설정했다.
- 암호화 값을 세팅하는방식은 각 스타일에 따라 정해질 수 있을 것 같다. 필자 경우는 도커 환경을 통해서 env를 전달하고 있으며 해당 암호화 값을 전달하여 어플리케이션을 구동하는 방식으로 처리하고 있다.
- 보안 정보를 관리함으로써 데이터 자산을 좀 더 안정적이게 보호할 수 있는 기수을 배울는 시간을 가졌다.
참고
https://junhyunny.github.io/java/spring-boot/security/jasypt/
https://devel-repository.tistory.com/32
'Spring' 카테고리의 다른 글
Spring Boot + Quartz 적용하기 - 3 (1) | 2024.09.17 |
---|---|
Spring Boot + Quartz 적용하기 - 2 (1) | 2024.09.16 |
Spring Boot + Quartz 적용하기 - 1 (0) | 2024.09.15 |
Spring Boot Logback 설정 (0) | 2024.03.21 |
Spring Boot 정적 컨텐츠 처리 (0) | 2024.03.18 |