웹 개발

spring boot properties 암호화 (Jasypt)

노루아부지 2021. 7. 11. 23:05

Spring boot로 개발을 하다 보면 application.properties나 application.yml 등의 설정 파일을 사용합니다. 이 설정 파일에는 서버 연결 정보, DB 연결 정보 등과 같은 민감한 정보가 있을 수 있습니다.

그래서 실무를 하다보면 민감한 정보는 암호화하지 않게 되면 보안진단 시 문제가 발생합니다.

 

따라서 민감한 정보는 암호화를 해야 하는데, Spring boot와 연동해서 쉽게 사용할 수 있는 것이 Jasypt 라이브러리(오픈소스) 입니다.

 

사용방법은 다음과 같습니다.

(Spring boot 이외에도 사용 가능하지만, 여기서는 Spring boot에서 사용하는 방법을 기록합니다.)

 

1. Dependency 추가

1.1 Maven

pom.xml에 아래와 같이 추가합니다.

<dependency>
  <groupId>com.github.ulisesbocchio</groupId>
  <artifactId>jasypt-spring-boot-starter</artifactId>
  <version>1.16</version>
</dependency>

 

1.2 gradle

build.gradle에 아래 코드를 추가합니다.

compile "com.github.ulisesbocchio:jasypt-spring-boot-starter:1.16"

 

 

2. Config class 생성

package com.example.demo;

import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JasyptConfig {
  @Bean("jasyptStringEncryptor")
  public StringEncryptor stringEncryptor() {
    PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
    SimpleStringPBEConfig config = new SimpleStringPBEConfig();
    config.setPassword("test"); //암호화에 사용할 키 -> 중요
    config.setAlgorithm("PBEWithMD5AndDES"); //사용할 알고리즘
    config.setKeyObtentionIterations("1000");
    config.setPoolSize("1");
    config.setProviderName("SunJCE");
    config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
    config.setStringOutputType("base64");
    encryptor.setConfig(config);
    return encryptor;
  }
}

 

 

3. 설정 파일에 추가

(여기서는 application.properties를 사용합니다.)

jasypt.encryptor.bean=jasyptStringEncryptor

 

 

4. 암호화된 값을 생성

이제 데이터를 암호화해야 합니다.

여기서는 간단히 main 메서드를 이용합니다.

public static void main(String[] args) {
  StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
  pbeEnc.setAlgorithm("PBEWithMD5AndDES");
  pbeEnc.setPassword("test"); //JasyptConfig에 설정된 암호화 키를 입력

  String enc = pbeEnc.encrypt("1234"); //암호화 할 내용
  System.out.println("enc = " + enc); //암호화 한 내용을 출력

  //테스트용 복호화
  String des = pbeEnc.decrypt(enc);
  System.out.println("des = " + des);
}

 

 

위 코드를 실행하면 아래와 같이 Console에 표시됩니다.

> Task :JasyptConfig.main()
enc = rRrtMnD2/HZzSVqc96k3ng==
des = 1234

 

 

5. 설정 파일에 암호화된 값을 입력합니다.

Jasypt는 암호화된 값을 입력할 때 ENC으로 감싸줍니다.

spring.datasource.sql-script-encoding=UTF-8
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=ENC(rRrtMnD2/HZzSVqc96k3ng==)
spring.datasource.username=ENC(rRrtMnD2/HZzSVqc96k3ng==)
spring.datasource.password=ENC(rRrtMnD2/HZzSVqc96k3ng==)
728x90
loading