Jasypt 이용해 민감한 정보 암호화 작업
AWS 데이터베이스 접속 정보를 원격 저장소에 올려야 하는 상황에서 Jasypt로 application.yml 속성을 암호화하고, 복호화 키는 실행 환경변수로 분리한 적용 기록.
작성날짜: 24.09.07
상황
- aws 데이터베이스 정보 원격 레포지토리 올려야되는 상황
- 보안 이슈 발생
시도
Jasypt라이브러리 이용
적용 순서
1. build.gradle 파일 🤩 Jasypt 의존성 추가
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'
2. application.yml 암호화할 속성 설정
spring:
datasource:
url: ENC(암호화된_URL)
username: ENC(암호화된_사용자명)
password: ENC(암호화된_비밀번호)
# 기본설정
jasypt:
encryptor:
algorithm: PBEWITHHMACSHA512ANDAES_256
iv-generator-classname: org.jasypt.iv.RandomIvGenerator
3. 암호화 생성을 위한 간단한 테스트 클래스 생성
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor
import org.jasypt.iv.RandomIvGenerator
import org.junit.jupiter.api.Test
class JasyptTest {
@Test
fun encryptProperties() {
val encryptor = StandardPBEStringEncryptor().apply {
setAlgorithm("PBEWITHHMACSHA512ANDAES_256")
setPassword("your_secret_key") // JASYPT_ENCRYPTOR_PASSWORD
setIvGenerator(RandomIvGenerator())
}
val url = encryptor.encrypt("jdbc:h2:mem:testdb")
val username = encryptor.encrypt("sa")
val password = encryptor.encrypt("yourpassword")
println("url: $url")
println("username: $username")
println("password: $password")
}
}
- 테스트 실행 후 암호화된 값 application.yml 파일에 적용
4. (선택) Jasypt 설정을 위한 설정 클래스 생성
커스터마이징 가능 (세밀한 동작 + 특정 알고리즘, IV 생성기 사용하고 싶을 때 사용)
import org.jasypt.encryption.StringEncryptor
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor
import org.jasypt.iv.RandomIvGenerator
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
@Configuration
class JasyptConfig {
@Bean("jasyptStringEncryptor")
fun stringEncryptor(): StringEncryptor {
return StandardPBEStringEncryptor().apply {
setAlgorithm("PBEWITHHMACSHA512ANDAES_256")
setPassword(System.getenv("JASYPT_ENCRYPTOR_PASSWORD"))
setIvGenerator(RandomIvGenerator())
}
}
}
5. (추가) intellij 이용해 환경변수 설정
실제 적용된 코드
# Database configuration for MySQL
# 암호화
spring:
datasource:
url: ENC(yddkldjrangZGGzGaAaEx2VaEI34o7RSEr8Sl8cY5wlj0VDz+DaOnq6Fh/01XKbgPULh5diRx5oYtvti2fGqDNKfD90ncykyp/28aO9azoQ4iLuTuQxCE0sMxQN7TkAMupQvUhhnLyJ7hobt5dw8Y63WNf2pcwRedvql7NuGAJo=)
username: ENC(ijo4Jc/UZcp0vqbAo3zcYCFx4XXslvVNAJ8ydo2157fcmujzA7tz/rVy8Xmyp+ZS)
password: ENC(3eqf88zhi8cUIRZ8JpTMv/De/uoQkFwD01xQa/5Bu5SjX52W9/EKFq412vqZZXXZdLxRP+nuP2pxXnq6akoZHQ==)
driver-class-name: com.mysql.cj.jdbc.Driver
sql:
init:
mode: never
...