Skip to content

[project] Jasypt 라이브러리를 이용한 YML 파일 암호화하기

이은비 edited this page Feb 11, 2023 · 1 revision

Jasypt 라이브러리를 이용한 YML 파일 암호화하기

해당 페이지는 Jasypt 라이브러리를 코틀린 + 스프링 환경에서 적용하는 과정을 담고 있습니다.

왜 Jasypt 인가?

개발자가 암호화 동작 방식에 대한 깊은 이해도가 없어도 자신의 프로젝트에 기본 암호화 기능을 추가할 수 있도록 도와주는 자바 라이브러리로, 자바 기반 여러 프레임워크에서 암복호화를 지원해주는 오픈소스입니다.

본 프로젝트에서는 yml 파일을 노출할 파일 ( application.yml, application-dev.yml, application-prod.yml )과 노출하지 않을 파일 ( application-secret.yml )로 구분하고, 노출하지 않을 파일을 .gitignore에 담으려 했습니다.

하지만, 이렇게 되면 프로젝트를 진행하면서 노출하지 않아야 하는 값들이 증가함에 따라 그 원본 데이터를 주기적으로 팀원들과 공유해야 하며 그 과정에서 정보의 유출 가능성이 높다고 판단하였습니다. 따라서 Jasypt 라이브러리를 통해 노출하지 않을 민감한 정보들을 암호화하여 github에 올려두고, 이에 사용된 패스워드만을 공유하기로 하였습니다.

Jasypt 적용 방법

  1. build.gradle.kts에 dependency 추가하기
...

dependencies {
    // Kotlin
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
    // Springboot
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("org.springframework.boot:spring-boot-starter-data-jpa")
    developmentOnly("org.springframework.boot:spring-boot-devtools")
    // Database
    runtimeOnly("com.mysql:mysql-connector-j")

    // Jasypt
    implementation ("com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4")
    // Springboot Test
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    testImplementation("org.springframework.restdocs:spring-restdocs-mockmvc")
}

...

위에 파일은 본 프로젝트에서 사용하고 있는 build.gradle.kts 파일입니다. ( 해당 게시글을 작성하던 시점 기준 ) 주석에 표시한 것처럼 Jasypt 라이브러리를 사용하기 위해서는 위의 의존성 한 줄을 추가해주어야 합니다.

  1. config 파일 생성
@Configuration
class JasyptConfig(
        @Value("\${jasypt.encryptor.password}") // vm 옵션을 통해 패스워드 주입
        private val password: String
){
    @Bean("jasyptStringEncryptor")
    fun stringEncryptor(): StringEncryptor {
        val encryptor = PooledPBEStringEncryptor()
        val config = SimpleStringPBEConfig()
        config.password = password
        config.algorithm = "PBEWITHMD5AndDES"
        config.setKeyObtentionIterations("1000")
        config.setPoolSize("1")
        config.stringOutputType = "base64"
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator")
        encryptor.setConfig(config)
        return encryptor
    }
}

라이브러리를 사용하기 위한 최소한의 설정을 담은 config 클래스입니다. @Value 어노테이션을 통해 VM 옵션으로 패스워드를 넘겨 받아 아래 config에 담습니다.

  1. 노출하지 않을 값 암호화하기

https://www.devglan.com/online-tools/jasypt-online-encryption-decryption

위의 사이트에 접속해서 암호화를 진행하면 됩니다.

image

Encryption 측 첫번째 input 값에는 노출하지 않을 원본 데이터를 넣습니다.
암호화 방식은 Two way Encryption을 선택합니다.
그 아래 input 값에는 암호화에 사용될 자신만의 패스워드를 넣습니다. ( 예시를 위해 yourSecretPassword 라고 작성했습니다. )
그 후, 아래 Encrypt 버튼을 누르면 아래 암호화된 값이 출력됩니다.

Decryption 측 첫 번째 input 값에는 암호화된 값을 넣습니다.
그 아래는 Decrypt Password를 선택합니다. ( 패스워드를 통해 복호화를 진행하겠다는 의미입니다. )
아래 input에는 암호화에 사용된 자신만의 패스워드를 넣습니다. ( 앞서 yourSecretPassword 를 작성하면 되겠죠? )
그 후, Match/Decrypt 버튼을 누르면 아래 원본된 값이 출력됩니다.

  1. YML에 암호화된 값 넣기
spring:
  redis:
    host: ENC(p/abOXePKEqEury7J1Fcgmv88W2tDIhJ)
    port: 6379

위와 같이 노출하지 않을 값을 앞서 사이트에서 암호화한 뒤, 그 값을 ENC()로 감싸서 YML 파일에 작성하면 됩니다.

  1. Run configuration 수정하기

인텔리제이 환경 기준, Run 버튼 옆에 Edit Configuration을 눌러 아래와 같이 설정해줍니다.

image

VM Option으로 암호화에 사용된 패스워드를 넘겨주면, @Value를 통해 값이 전달됩니다.

이상 암호화 설정에 관한 포스트를 마무리하겠습니다.!

Clone this wiki locally