Programming/Spring Boot

[Jasypt] Spring Boot 애플리케이션의 프로퍼티 암호화

빈쿵바라기 2023. 3. 24. 18:52

Jasypt(Java Simplified Encryption) Spring Boot는 Spring Boot 애플리케이션의 속성 소스에 대한 암호화 지원을 제공합니다. Git의 public repository나 외부에 공개 되면 안되는 정보들을 암호화하여 탈취되는 것을 막기 위해 사용합니다.

Jasypt is a java library which allows the developer to add basic encryption capabilities to his/her projects with minimum effort, and without the need of having deep knowledge on how cryptography works.

Jasypt는 개발자가 암호화 작동 방식에 대한 깊은 지식 없이도 최소한의 노력으로 자신의 프로젝트에 기본 암호화 기능을 추가할 수 있도록 하는 Java 라이브러리입니다.

 

1. Dependency 추가

<!-- https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter -->
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>

 

2. Encryptor Configuration

@Configuration
public class JasyptConfig {

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

    @Bean("jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(password);
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        return encryptor;
    }
}

비밀 키인 ${jasypt.encryptor.password} 는 컨테이너 실행 시 외부에서 주입 받아 사용합니다. 비밀키를 알면 암호화, 복호화가 가능하므로 탈취에 유의해야합니다.

암호생성기(encryptor)를 만들 때 옵션 값들을 지정할 수 있습니다.

  • 비공개 키
  • 암호화 알고리즘
  • 인코딩(encoding) 타입
  • 솔트(salt) 값 생성기
  • 기타

비공개 키는 필수로 입력 받아야하는 값이고, 나머지는 별도 설정이 없다면 다음과 같은 기본 값을 사용합니다.

Key Required Devault 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

 

3. 암호화하기

평문을 암호화하는 방법은 테스트 코드를 작성하여 암호화 하는 방법과 외부 사이트를 이용하여 암호화 하는 방법으로 두가지가 있습니다.

3.1. 암호화 코드 작성

Encryptor Configuration에서 만든 암호 생성기(encryptor)와 같은 설정으로 암호화 된 평문을 추출합니다. 암호화 된 값을 생성한 이후 관련 코드는 제거합니다.

public static void main(String[] args) {
    PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
    SimpleStringPBEConfig config = new SimpleStringPBEConfig();
    config.setPassword("비밀키");
    config.setAlgorithm("PBEWithMD5AndDES");
    config.setKeyObtentionIterations("1000");
    config.setPoolSize("1");
    config.setProviderName("SunJCE");
    config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
    config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");
    config.setStringOutputType("base64");
    encryptor.setConfig(config);
    
    System.out.println(encryptor.encrypt("암호화 하고자 하는 값"));
}

 

3.2. 외부 사이트 사용

외부 사이트에서 암호화 작업을 수행할 수 있습니다. 이 사이트에선 PBEWithMD5AndDES 암호화 알고리즘 방식을 사용합니다.

 

4. 생성된 암호화 값을 사용하기

spring:
  datasource:
    url: ENC(xNaJx2/9+OHzb5d7XKfdNQ==)
    username: ENC(SXTfVV3MGkzW070T/qgJxQ==)
    password: ENC(SXTfVV3MGkzW070T/qgJxQ==)
    driver-class-name: ENC(jfl2bJ1aewTZ9elDI/7nSQ==)

암화된 값을 사용할 때는 ENC() 내부에 암호화 된 값을 넣습니다.

 

5. 어플리케이션 실행 시 비밀키 전달

Encryptor Configuration 에서 사용한 비밀 키(${jasypt.encryptor.password})는 외부에서 전달해주어야 합니다.

  • java -jar 명령어로 어플리케이션 실행 시 전달
java -jar target/jasypt-my-project.jar -Djasypt.encryptor.password=password
  • Spring boot에서 어플리케이션 실행 시 VM arguments 전달
-Djasypt.encryptor.password=password
  • Maven packge 시 시스템 변수 전달
mvn package -Djasypt.encryptor.password=password
  • Tomcat config/catalina.properties 파일 하단에 시스템변수 추가
jasypt.encryptor.password=password