[Spring Boot] Jasypt으로 암호화 적용하기
개발 환경
- gradle version: 7.4.1
- spring boot version: 2.6.13
- 언어: Kotlin
Spring Boot에 Jasypt library 적용
프로젝트에 Jayspt를 적용해 봅시다!
Dependency 추가
Spring boot에서는 jasypt-spring-boot-starter(maven repository 링크)를 사용하고 있습니다.
gradle을 사용하고 있으니 맞는 녀석을 가져옵니다.
// https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'
Jasypt Configuration 생성
이제 프로젝트에서 사용할 Configuration
을 생성합시다.
보통은 Jasypt PASSWORD만 환경변수 등을 사용하여 숨기는데 저는 ALGORITHM도 한 번 숨겨보았습니다.Configuration
을 등록해 두면 프로젝트를 실행할 때에 application.yaml
등에 암호화되어 있는 부분들(ENC(***)
)을 복호화하여 프로젝트를 실행시킵니다.
@Configuration
class JasyptConfig(
@Value("\${JASYPT_PASSWORD}") private val password: String,
@Value("\${JASYPT_ALGORITHM}") private val algorithm: String
) {
@Bean
fun jasyptStringEncryptor(): StandardPBEStringEncryptor {
val encryptor = StandardPBEStringEncryptor()
encryptor.setAlgorithm(algorithm)
encryptor.setPassword(password)
return encryptor
}
}
Jasypt 알고리즘은 아래처럼 정말 다양합니다.
[PBEWITHHMACSHA1ANDAES_128, PBEWITHHMACSHA1ANDAES_256, PBEWITHHMACSHA224ANDAES_128, PBEWITHHMACSHA224ANDAES_256, PBEWITHHMACSHA256ANDAES_128, PBEWITHHMACSHA256ANDAES_256, PBEWITHHMACSHA384ANDAES_128, PBEWITHHMACSHA384ANDAES_256, PBEWITHHMACSHA512ANDAES_128, PBEWITHHMACSHA512ANDAES_256, PBEWITHMD5ANDDES, PBEWITHMD5ANDTRIPLEDES, PBEWITHSHA1ANDDESEDE, PBEWITHSHA1ANDRC2_128, PBEWITHSHA1ANDRC2_40, PBEWITHSHA1ANDRC4_128, PBEWITHSHA1ANDRC4_40]
몇 개 테스트를 해봤는데, 이 중에서 AES를 사용하면 아래처럼 SaltGenerator
와 IvGenerator
를 설정해줘야 합니다.
아니면 제대로 암호화/복호화 못해서 삽질을 많이 했으니, 혹시나 안되면 저 부분을 추가해 보시길 추천드립니다.
암호화/복호화 방식을 아직 잘 몰라서 이유는 다음번에 알아보는 것으로!
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor
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
class JasyptConfig(
@Value("\${JASYPT_PASSWORD}") private val password: String,
@Value("\${JASYPT_ALGORITHM}") private val algorithm: String
) {
@Bean
fun jasyptStringEncryptor(): StandardPBEStringEncryptor {
val encryptor = StandardPBEStringEncryptor()
encryptor.setAlgorithm(algorithm)
encryptor.setPassword(password)
val config = SimpleStringPBEConfig()
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator")
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator")
encryptor.setConfig(config)
return encryptor
}
}
Jasypt 다운로드
실제로 어떤 값으로 암호화/복호화가 되는지 확인하기 위해 Jasypt library를 다운받습니다.
Jasypt 공식 문서 링크에 가서 Jasypt를 살펴봅시다.
아래와 같은 내용들이 눈에 띄네요.
- Transparent integration with Hibernate.
- Suitable for integration into Spring-based applications and also transparently integrable with Spring Security.
다운로드를 누르면 결국에는 깃헙으로 들어가게 됩니다.
다운로드는 jasypt-{version}-dist.zip을 다운로드하셔야 합니다.
깃헙의 Release를 가서 과감하게 Latest Version으로 다운로드하여 봅니다.
근데 과감하게 누른 것치고는 Last release date 가 2020.01.16이네요.
무슨 일이죠? 요새 다른 encrypt tool을 쓰나요? 아신다면 저도 공유해 주세요.
이제 압축 해제를 하고 아래와 같이 jasypt cli를 통해 암호화/복호화를 해봅니다.
./bin/encrypt.sh password="" input=""
./bin/decrypt.sh password="" input=""
암호화가 필요한 부분은./bin/encrypt.sh를 통해 encrypt 하여 프로젝트에 ENC(***)로 넣어주면 됩니다.
security:
oauth2:
client:
kakao:
client-id: ENC("SMGXj/nniY1GLm8/Eav0QPKDCaYV3iwvbmljghv/HtItZ8+5K84g92eiPOSJTi69h0MMXQM1+PMicJHUpAZu08/6rHtyuSuksO2iMyRJQ5A=")
token-uri: https://kauth.kakao.com/oauth/token
redirect_uri: ENC("priF9Lm6F5Fh1ktY8LKbZsvZZz0NMpC31TqX5Mrc/MfffknSO337yGnBpPol/EcJ3Wvprmq1nWcthNsbpEO63g==")
user-info-uri: https://kapi.kakao.com/v2/user/me
그럼 프로젝트에서 Jasypt를 이용한 암호화/복호화 적용 끝!