Today
-
Yesterday
-
Total
-

ABOUT ME

-

  • Spring Boot | jasypt를 사용하여 프로퍼티 암호화 하기
    ▼ Backend/스프링 (Spring) 2022. 2. 24. 13:26
    반응형

    jasypt란

    개발자가 암호화 작동 방식에 대한 깊은 지식 없이도 최소한의 노력으로 프로젝트에 기본 암호화 기능을 추가할 수 있도록 하는 Java 라이브러리이다. 주로 프로젝트가 공개되어도 프로퍼티 내에 작성된 설정 정보를 암호화하여 노출시키지 않는 목적으로 사용한다.

     

    📌 Dependency 추가

    Maven

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

    Gradle

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

     

    Jasypt 설정 및 Bean 등록

    코드를 보면 KEY를 상수로 작성하였지만 실제로 운영 시에는 보안을 위해 운영체제 환경설정으로 등록하거나 java -jar 명령어로 애플리케이션 실행 시 전달하여 사용한다.

    @Value("${jasypt.encryptor.key}") 를 사용한다고 가정하면, java -jar 배포시 --jasypt.encryptor.key=값을 추가한다.

     

    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 {
        private static final String KEY = "218905C7CD2C857E34E95E8FB59C0DDE3DCBFB97";
        private static final String ALGORITHM = "PBEWithMD5AndDES";
    
        @Bean("jasyptStringEncryptor")
        public StringEncryptor stringEncryptor() {
            PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
            SimpleStringPBEConfig config = new SimpleStringPBEConfig();
            config.setPassword(KEY); // 암호화할 때 사용하는 키
            config.setAlgorithm(ALGORITHM); // 암호화 알고리즘
            config.setKeyObtentionIterations("1000"); // 반복할 해싱 회수
            config.setPoolSize("1"); // 인스턴스 pool
            config.setProviderName("SunJCE"); // 프로바이더
            config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); // salt 생성 클래스 지정
            config.setStringOutputType("base64"); // 인코딩
            encryptor.setConfig(config); // 설정 정보 Set
            return encryptor;
        }
    }

     

    jasypt 온라인 암복호화 사이트

    사용할 준비는 끝났고 해당 사이트를 이용해서 사용할 값을 암호화하여 프로퍼티에 ENC(설정 값)으로 작성한다.

    • Plain-Text: VENH_TISTORY
    • Type: Two Way Encryption
    • Secret-Key: 218905C7CD2C857E34E95E8FB59C0DDE3DCBFB97

     

     

    Application.properties

    properties.test.value = ENC(BfYEBVldiVdo2N7ecQWBYX3PFveFwPe5)

     

    테스트

    JasyptTest 클래스를 생성해서 프로퍼티 값을 가져올 get 메서드를 하나 생성한다.

     

    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    @Component
    public class JasyptTest {
    
        @Value("${properties.test.value}")
        private String propertiesTestValue;
    
        public String getPropertiesTestValue() {
            return propertiesTestValue;
        }
    }

     

    @SpringbootTest

    암호화하기 전 값인 VENH_TISTORY와 프로퍼티로 가져온 값이 같은지 확인하는 코드를 작성한다.

     

    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import static org.hamcrest.MatcherAssert.*;
    import static org.hamcrest.CoreMatchers.*;
    
    @SpringBootTest
    class JasyptApplicationTests {
    
        @Autowired
        private JasyptTest jasyptTest;
    
        @Test
        void jasypt_테스트() {
            assertThat("VENH_TISTORY", is(equalTo(jasyptTest.getPropertiesTestValue())));
        }
    }

     

    결과

     

    GitHub

    Reference

     

     

    반응형

    댓글

Designed by Tistory.