상세 컨텐츠

본문 제목

[TIL#27] 가을에 시작한 Spring <Jasypt>

카테고리 없음

by DK9 2023. 12. 27. 10:37

본문

1. Jasypt

.yml 파일이나. properties 파일의 키 값이나, 비밀번호를 암호화하는 라이브러리이다. 번외로 개인이 만든 라이브러리이다.

Github 등 정보가 그대로 노출되면 문제가 발생할 소지가 있는 곳에 업로드할 때 문제를 피하고자 하는 몇 가지 방법 중 하나이다.

 

 1) 사용 방법

  일단 gradle 에 의존성을 추가한다.

dependencies {
// jasypt
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'
}

 

 사용되는 알고리즘은 몇 가지가 있는데 3.0 버전부터 기본 알고리즘이 PBEWithMD5AndDES → PBEWITHHMACSHA512ANDAES_256로 변경됐다.

 하지만 자주 사용되는 알고리즘은 이 두 가지라고 볼 수 있다.

  • "PBEWithMD5AndDES"
  • "PBEWithMD5AndTripleDES"

gradle 을 설정했다면 config를 설정해 주면 된다.

package com.example.practice.global.config;

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

@Configuration
@EnableConfigurationProperties
public class JasyptConfig {

    private static final String PASSWORD = "DB_DECRYPT_KEY";
    private static final String ALGORITHM = "PBEWithMD5AndTripleDES";
    private static final String KEY_OBJECTION_ITERATIONS = "1000";
    private static final String POOL_SIZE = "1";
    private static final String PROVIDER_NAME = "SunJCE";
    private static final String SALT_GENERATOR_CLASS_NAME = "org.jasypt.salt.RandomSaltGenerator";
    private static final String STRING_OUTPUT_TYPE = "base64";

    @Bean("jasyptStringEncryptor")
    StringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(System.getenv(PASSWORD));
        config.setAlgorithm(ALGORITHM);
        config.setKeyObtentionIterations(KEY_OBJECTION_ITERATIONS);
        config.setPoolSize(POOL_SIZE);
        config.setProviderName(PROVIDER_NAME);
        config.setSaltGeneratorClassName(SALT_GENERATOR_CLASS_NAME);
        config.setStringOutputType(STRING_OUTPUT_TYPE);
        encryptor.setConfig(config);
        return encryptor;
    }

}

 

이후 환경변수에 사용할 비밀번호를 세팅해줘야 한다.

 

메뉴 상단 run >> configuration

 

 그럼 사용할 준비는 끝났다. 이제 본격적으로 암호화한 후에 기재를 해주면 된다. 암호화하는 방법에도 몇 가지 방법이 있는데 암호화하는 홈페이지에 가서 암호화된 문장을 뽑아오는 방법도 있겠지만 나는 테스트 코드를 활용한 방법을 사용했다.

 

package com.example.practice;

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

public class JasyptConfigTest {

    @Test
    void stringEncryptor() {
        // given
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        encryptor.setPassword("11111"); // 설정한 비밀번호
        encryptor.setAlgorithm("PBEWithMD5AndTripleDES");
        // 기본 알고리즘 외 다른 알고리즘을 사용한 경우 작성
        
        String test = "test";

        // when, then
        String actual = encryptor.encrypt(test);
        Assertions.assertEquals(test, encryptor.decrypt(actual));
        System.out.println(actual);
    }
}

 

 

"test"가 암호화된 모습을 볼 수 있다. 이제 본인이 사용할 값들을 암호화하여 .yml 파일이나. properties 파일에 적용하면 된다.

 

spring.datasource.url=ENC(fcLtXDKPR27LbrqAgYf/5+JPw9CMLuEfR81iz3mYAqYTp4M1s9Wrdf1eDt47zKd+)
spring.datasource.username=ENC(pb/kCaC08NZFhFaKEnXf3Q==)
spring.datasource.password=ENC(cK+l1+N2L+pkl1R0ABr5xg==)
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

 

 

 2) 추가

 암호화를 가볍게 경험하거나 개인 프로젝트 때 사용하기 좋은 프로그램이다. 하지만 실무에서는 잘 사용되지 않는다고 한다.

 앞서 말했듯이 개인이 만든 라이브러리이기에 회사의 프로젝트를 진행함에 있어 개인이 만든 라이브러리를 사용한다는 것은 어불성설이다. 하여 AWS 혹은 많은 회사에서 작성한 라이브러리를 통해 암호화하여 배포하거나 다른 방법으로 보안을 유지한다고 한다.