-
Notifications
You must be signed in to change notification settings - Fork 0
[project] Jasypt 라이브러리를 이용한 YML 파일 암호화하기
해당 페이지는 Jasypt 라이브러리를 코틀린 + 스프링 환경에서 적용하는 과정을 담고 있습니다.
개발자가 암호화 동작 방식에 대한 깊은 이해도가 없어도 자신의 프로젝트에 기본 암호화 기능을 추가할 수 있도록 도와주는 자바 라이브러리로, 자바 기반 여러 프레임워크에서 암복호화를 지원해주는 오픈소스입니다.
본 프로젝트에서는 yml 파일을 노출할 파일 ( application.yml, application-dev.yml, application-prod.yml )과 노출하지 않을 파일 ( application-secret.yml )로 구분하고, 노출하지 않을 파일을 .gitignore에 담으려 했습니다.
하지만, 이렇게 되면 프로젝트를 진행하면서 노출하지 않아야 하는 값들이 증가함에 따라 그 원본 데이터를 주기적으로 팀원들과 공유해야 하며 그 과정에서 정보의 유출 가능성이 높다고 판단하였습니다. 따라서 Jasypt 라이브러리를 통해 노출하지 않을 민감한 정보들을 암호화하여 github에 올려두고, 이에 사용된 패스워드만을 공유하기로 하였습니다.
- 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 라이브러리를 사용하기 위해서는 위의 의존성 한 줄을 추가해주어야 합니다.
- 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에 담습니다.
- 노출하지 않을 값 암호화하기
https://www.devglan.com/online-tools/jasypt-online-encryption-decryption
위의 사이트에 접속해서 암호화를 진행하면 됩니다.
Encryption 측 첫번째 input 값에는 노출하지 않을 원본 데이터를 넣습니다.
암호화 방식은 Two way Encryption을 선택합니다.
그 아래 input 값에는 암호화에 사용될 자신만의 패스워드를 넣습니다. ( 예시를 위해 yourSecretPassword 라고 작성했습니다. )
그 후, 아래 Encrypt 버튼을 누르면 아래 암호화된 값이 출력됩니다.
Decryption 측 첫 번째 input 값에는 암호화된 값을 넣습니다.
그 아래는 Decrypt Password를 선택합니다. ( 패스워드를 통해 복호화를 진행하겠다는 의미입니다. )
아래 input에는 암호화에 사용된 자신만의 패스워드를 넣습니다. ( 앞서 yourSecretPassword 를 작성하면 되겠죠? )
그 후, Match/Decrypt 버튼을 누르면 아래 원본된 값이 출력됩니다.
- YML에 암호화된 값 넣기
spring:
redis:
host: ENC(p/abOXePKEqEury7J1Fcgmv88W2tDIhJ)
port: 6379
위와 같이 노출하지 않을 값을 앞서 사이트에서 암호화한 뒤, 그 값을 ENC()로 감싸서 YML 파일에 작성하면 됩니다.
- Run configuration 수정하기
인텔리제이 환경 기준, Run 버튼 옆에 Edit Configuration을 눌러 아래와 같이 설정해줍니다.
VM Option으로 암호화에 사용된 패스워드를 넘겨주면, @Value를 통해 값이 전달됩니다.
이상 암호화 설정에 관한 포스트를 마무리하겠습니다.!