Spring

Jasypt 암호화를 이용하여 정보 보호하기

댕발바닥 2024. 4. 1. 23:40

jasypt 

  • jasypt는 형상관리, 애플리케이션 배포시에 DB계정 및 중요한 비밀 키 값들을 평문으로 저장하는것을 막기 위해 프로퍼티를 암호화 할 수 있게 제공해주는 라이브러리 입니다.

 

사용법 및 설명

  • 의존성(dependency) 추가
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.4</version>
</dependency>

 

implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4'

 

  • @EnableEncryptableProperties 어노테이션을 통하여 SpringBoot 암호화할 빈을 생성해줄 class를 생성한다.

  • Bean 이름을 지정해주 않게 되면 Default 빈 명칭은 jasyptStringEncryptor 사용한다
    빈의 명칭을 변경하고 싶으면 ymal에 해당 빈 이름을 설정하여 클래스에서 빈 명칭을 설정해준다.

    jasypt: 
      encryptor:
        bean: #{빈 이름}

 

  • 암호기를 만들때는 아래와 같은 옵션들을 지정할 수있다
    Key Required Default Value
    jasypt.encryptor.password True -
    jasypt.encryptor.algorithm False PBEWITHHMACSHA512ANDAES_256
    jasypt.encryptor.key-obtention-iterations False 1000
    jasypt.encryptor.pool-size False 1
    jasypt.encryptor.provider-name False SunJCE
    jasypt.encryptor.provider-class-name False null
    jasypt.encryptor.salt-generator-classname False org.jasypt.salt.RandomSaltGenerator
    jasypt.encryptor.iv-generator-classname False org.jasypt.iv.RandomIvGenerator
    jasypt.encryptor.string-output-type False base64
    jasypt.encryptor.proxy-property-sources False false
    jasypt.encryptor.skip-property-sources False empty list
    - 비공개 키
    - 암호화 알고리즘
    - 인코딩
    - 솔트
    - 기타

JasyptConfig 클래스

 

import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import lombok.extern.slf4j.Slf4j;
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
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
@EnableEncryptableProperties
@Slf4j
public class JasyptConfig {

    @Value("${encryptor.key}")
    private String password;

    private final String ALGORITHM = "PBEWITHHMACSHA512ANDAES_256"; // HmacSHA512로 부터 생성된 키를 사용하여 데이터를 AES-256 알고리즘을 이용하여 암호화
    private final int SALT = 3308;
    private final int POOL_SIZE = 1;
    private final String ENCODING = "base64";

    @Bean("jasyptStringEncryptor")
    public StringEncryptor stringEncryptor(){

        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();

        config.setPassword(password); // 암호화 키
        config.setAlgorithm(ALGORITHM); // 적용 알고리즘
        config.setKeyObtentionIterations(SALT); // 해싱 반복 횟수
        config.setPoolSize(POOL_SIZE); // 인스턴스 Pool 개수
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); // salt 생성
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator"); // IV 생성기
        config.setStringOutputType(ENCODING); // 인코딩 방식
        encryptor.setConfig(config);

        return encryptor;
    }
}

 

 

암호값 설정

  • ymal 파일에 직접 해당 값을 세팅할 수있다.
  • 필자는 vm option으로 전달받은 값을 세팅하게 만들었다.

ymal 세팅

 

-Dencryptor.key=qKqrSSqzxCcQYTjLMK5
-Dspring.datasource.url=ENC(YJ7o1Qjwj9huigdLvk3n1mNI5Q4Jn3DXUAgXLlDUZdQI4UGXj+EZ7rLugm79VgLGy7CY9F6dKxNTOMW5thEmHQ==)
-Dspring.datasource.username=ENC(e0L4EAherw6lORjxkpXPdR58fXb/kr6ziPB3ODetGdOcyXQ37rKuoUitJSaOzrgd)
-Dspring.datasource.password=ENC(G2o8K6pBO/EimMEwyLf1MzhtXTN+rafoSZEfWPAenjvta2L9eseB6ha/Yp7BID3F)

 

위 처럼  option으로 통해 암호화 값을 전달하여 처리하는 방식으로 설정했다.

 

 

  • 암호화 값을 세팅하는방식은 각 스타일에 따라 정해질 수 있을 것 같다. 필자 경우는 도커 환경을 통해서 env를 전달하고 있으며 해당 암호화 값을 전달하여 어플리케이션을 구동하는 방식으로 처리하고 있다.
  • 보안 정보를 관리함으로써 데이터 자산을 좀 더 안정적이게 보호할 수 있는 기수을 배울는 시간을 가졌다.

 

참고

https://junhyunny.github.io/java/spring-boot/security/jasypt/

https://devel-repository.tistory.com/32