Spring

[Jasypt] Spring Boot yaml 파일 암호화

Karla Ko 2023. 10. 16. 23:25
728x90

 

Jasypt
Java Simplified Encryption의 약자로, 자바로 간단히 암호화할 수 있게 도와주는 라이브러리

 

파일트리
├ src
 │ └─ main
 │   │   ├─ JasyptConfig.kt
 │   │   └─ KotlinStudyApplication.kt
 │ └─ resources
 │      ├─ application.yml
 │      └─ jasypt-encryptor-password.txt
└─ .gitignore

 

1. build.gradle에 jasypt-spring-boot-starter 추가

dependencies {
    implementation ("com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.3")
    ... 생략
}

 

2. yaml 파일에 Jasypt 설정 정보 추가

# Jasypt
jasypt: 
  encryptor:
    bean: jasyptStringEncryptor # Jasypt Config 파일에서 등록하는 빈의 이름
    algorithm: PBEWithMD5AndDES # 암/복호화에 사용되는 알고리즘
    pool-size: 2 # 암호화 요청을 담고 있는 pool의 크기
    string-output-type: base64 # 암호화 이후에 어떤 형태로 값을 받을지 설정. base64 / hexadecimal을 선택
    key-obtention-iterations: 100000 # 암호화 키를 얻기 위해 반복해야 하는 해시 횟수

 

3. jasypt-encryptor-password 파일 생성

# 패스워드 설정

 

4.Jasypt Config 파일 생성

@Configuration
@EnableEncryptableProperties
class JasyptConfig {
    @Value("\${jasypt.encryptor.algorithm}")
    private val algorithm: String? = null

    @Value("\${jasypt.encryptor.pool-size}")
    private val poolSize = 0

    @Value("\${jasypt.encryptor.string-output-type}")
    private val stringOutputType: String? = null

    @Value("\${jasypt.encryptor.key-obtention-iterations}")
    private val keyObtentionIterations = 0

    val log = LoggerFactory.getLogger(javaClass)


    @Bean
    fun jasyptStringEncryptor(): StringEncryptor {
        val encryptor = PooledPBEStringEncryptor()
        encryptor.setPoolSize(poolSize)
        encryptor.setAlgorithm(algorithm)
        encryptor.setPassword(jasyptEncryptorPassword)
        encryptor.setStringOutputType(stringOutputType)
        encryptor.setKeyObtentionIterations(keyObtentionIterations)

        val source = "변환할 데이터"
        log.info("plane :: {}, encrypt :: {}", source, encryptor.encrypt(source))

        return encryptor
    }

    private val jasyptEncryptorPassword: String
        private get() = try {
            val resource = ClassPathResource("jasypt-encryptor-password.txt")
            Files.readAllLines(Paths.get(resource.uri)).stream().collect(Collectors.joining(""))
        } catch (e: IOException) {
            throw RuntimeException("Not found Jasypt password file.")
        }
}

 

5. 변환한 데이터를 yml 파일에 적용

spring:
  datasource:
      driver-class-name: org.mariadb.jdbc.Driver
      url: jdbc:mariadb:
      username:
      password: ENC([암호화값])

 

 6. jasypt-encryptor-password 파일 .gitignore에 추가

/src/main/resources/jasypt-encryptor-password.txt

 

 

728x90