삽질 주도 개발
article thumbnail
Published 2022. 11. 20. 03:50
Jasypt로 properties 암호화 Spring

Spring을 사용하면 많은 리소스를 관리하게 되는데, url, password, username 등의 데이터들은 노출이 되면 안된다.

 

그렇기 때문에 암호화를 해줘야 하는데, Jasypt라는 프로퍼티를 암호화해서 관리할 수 있다.

 

의존성 추가

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

 

암호화 프로퍼티 활성화

 

빈 주입

@Configuration
public class JasyptConfigure {
    @Value("${jasypt.encryptor.password}")
    private String key;

    @Bean("jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(key);
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
		
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        encryptor.setConfig(config);

        return encryptor;
    }
}

key 암호화하는 주된 키기 때문에 resource로 관리하지 않고 애플리케이션 구동시에 VM option에 추가할 것이다. 즉, key를 알지 못하면 애플리케이션을 실행할 수 없도록 한다.

 

 

위와는 별개로 더 많은 옵션을 할 수 있다. (alogithm, hashing 횟수, instance pool size 등)
그러나 아래와 같이 default로 설정된 값들이 있기 때문에 따로 세팅하지 않았다.

 

암호화된 문자열 구하기

방법은 다양하지만, 테스트 코드로 작성해서 암호화된 비밀번호를 얻어보겠다.

public class JasyptDecryptTest {

    @Test
    void userName() {
        String encryptUserName = jasyptEncode("sa");
        assertThat("sa").isEqualTo(encryptUserName);
    }

    @Test
    void url() {
        String encryptUrl = jasyptEncode("jdbc:h2:~/test;");
        assertThat("jdbc:h2:~/test;").isEqualTo(encryptUrl);
    }

    @Test
    void password() {
        String encryptPassword = jasyptEncode("password");
        assertThat("password").isEqualTo(encryptPassword);
    }


    private String jasyptEncode(String str) {
        String key = "test";  // key를 test로 사용한다.
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        encryptor.setAlgorithm("PBEWithMD5AndDES");
        encryptor.setPassword(key);

        return encryptor.encrypt(str);
    }
}

 

테스트 파일을 남겨놔도 되지만, 절대로 원격 저장소로 노출시키면 안된다.

 

 

VM 옵션 추가

 


 

Reference

 

Jasypt: Java simplified encryption - Jasypt: Java simplified encryption - Main

Jasypt 1.9.3 RELEASED! (May 25th, 2019) [DOWNLOAD and ChangeLogs] [WHAT'S NEW IN JASYPT 1.9] Java Simplified Encryption Jasypt is a java library which allows the developer to add basic encryption capabilities to his/her projects with minimum effort, and wi

www.jasypt.org

틀렸거나 개선할 점은 댓글 부탁드립니다. 저에게 큰 도움이 됩니다 :)