개발 환경

- 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를 사용하면 아래처럼 SaltGeneratorIvGenerator를 설정해줘야 합니다.
아니면 제대로 암호화/복호화 못해서 삽질을 많이 했으니, 혹시나 안되면 저 부분을 추가해 보시길 추천드립니다.
암호화/복호화 방식을 아직 잘 몰라서 이유는 다음번에 알아보는 것으로!

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를 이용한 암호화/복호화 적용 끝!

반응형
복사했습니다!