본문 바로가기

개발(합니다)/Java&Spring

[spring boot 설정하기-19] spring properties(+jasypt) 암호화 설정 및 테스트 소스

반응형

개발 환경 정보와 같은 노출되면 안되는 민감한 정보를

암호화하고 OS 환경변수로 등록하는 방법을 포스팅합니다.

관련 정보는 아래 사이트에서 확인할 수 있습니다.

github.com/ulisesbocchio/jasypt-spring-boot


 

1. 의존성 추가

버전을 명시하지 않으면 의존 주입이 안되어서

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

2. JasyptConifg.java

spring 구동 시 암복호화 설정 주입을 합니다.

package com.otrodevym.dm.config;

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
public class JasyptConifg {

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

    @Bean("jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        System.out.println("encryptKey : " + encryptKey);
        config.setPassword(encryptKey);
//        config.setPassword(System.getenv("JASYPT_PASSWORD")); // 환경 변수
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        return encryptor;
    }
}

3. application.yml

application.yml에서 @Bean("jasyptStringEncryptor") 빈 이름을 명시합니다.

jasypt:
  encryptor:
    bean: jasyptStringEncryptor
#    password: dm_password!@#$%^123456
#    property:
#      prefix: ENC[
#      suffix: ]

4. JasyptTest.java

암복호화가 잘 되는지 테스트합니다.

String plaintText = "평문 비밀번호"; 에는 사용하는 비밀번호를 넣습니다.
config.setPassword("암복호화 키"); 암복호화에 사용할 키를 넣습니다.
위 두가지 값은 노출되면 안됩니다.

package com.otrodevym.dm.config;

import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;

import static org.assertj.core.api.Assertions.assertThat;


@SpringBootTest
public class JasyptTest {


    @Test
    public void jasyt_test() {
        String plaintText = "평문 비밀번호";
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword("암복호화 키");
//        config.setPassword(System.getenv("JASYPT_PASSWORD"));
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);

        String encryptText = encryptor.encrypt(plaintText);
        System.out.println(encryptText);
        String decryptText = encryptor.decrypt(encryptText);
        System.out.println(decryptText);
        assertThat(plaintText).isEqualTo(decryptText);

    }

}

5. 사용 방법 및 환경변수로 설정

위 소스를 돌려보면 암호화 된 값이 나오고

해당 값을 'ENC(암호화 값)' 으로 감싸서 application.yml에 작성합니다.

5-1. 암호화 키 적용 하는 방법(+VM option)

위 사진처럼 @Value("${jasypt.encryptor.password}") 값을 설정해야 하는데
application.yml에 저장하면 의미가 없어지므로 VM option에서 설정합니다.

-Djasypt.encryptor.password=암호화할 키

5-2. 암호화 키 적용 하는 방법(+OS 환경변수)

암호화 키를 환경변수에 등록합니다.

1. @Configuration public class JasyptConifg { 에서 환경변수 가져오는 방법

2. application.yml에서 환경변수 가져오는 방법

${변수명} 형태로 지정하면 환경변수 값을 가져올 수 있습니다.

소스는 주입으로 수정합니다.

반응형