Application.properties 암호화하기

여상우·2023년 10월 29일
1

application.properties 암호화하기

초보 개발자로서 마주치는 당연한 문제 중 하나는 local에서 혼자 개발 할때와 실무에서 개발하는 환경이 다르다는 점이다.
local에서 혼자 개발할때야.. 비밀번호든 DB경로든 내맘대로고 localhost 주소를 크게 벗어나지를 않으니 application.properties를 사용할 일이 잘 없지만 여러 환경을 마주하게 되면 properties 파일은 지저분해지기 마련이다.

이중에서 특히 문제가 되는것은 DB 주소와 비밀번호의 암호화
깃허브에 올리던, 깃랩에 올리던 소스를 올리게 되면 주소와 비밀번호가 노출이 되기 때문에 이를 방지해야만 한다.
따라서 이 방법을 공유해보고자 포스팅을 작성하게 되었다.


보통 많이 사용하는것이 Jasypt 라이브러리 를 이용하는 것이라고 하여 나도 사용해보았다.

가장 먼저 해야 할 일은 gradle 의존성을 추가하는 일

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

요렇게 하나 추가해준다.

그리고 Configuration을 작성해주어야겠지?

import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
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
@EnableEncryptableProperties
public class JasyptConfig {

    @Bean("jasyptEncryptorDES")
    public StringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword("3456**);
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        return encryptor;
    }
}
  • PooledPBEStringEncryptor : 기본 jasypt의 String 암호화 객체
  • SimpleStringPBEConfig :jasypt의 String config 객체
  • config.setPassword : 정확히는 암호화 key이다. 진짜 암호가 아님
  • PBEWithMD5AndDES : 이건 jasypt 2.0.0 버전대에서 사용하는 알고리즘! jasypt 3.0.0 버전부터는 PBEWITHHMACSHA512ANDAES_256 알고리즘을 사용하는데.. 나는 환경상 어쩔 수 없이 기존 알고리즘을 사용하였다.

이렇게 하고 application.properties에 적용할 때에는

jasypt.encryptor.password = ${jasyptPassword}
jasypt.encryptor.ivGeneratorClassname = org.jasypt.iv.RandomIvGenerator
jasypt.encryptor.bean = jasyptEncryptorDES

--- 암호화하고싶은애들
spring.datasource.username = ENC(eXUHR+St2W7C5mJeP3sC6H4J1KbB54Yz)
spring.datasource.password = ENC(e+1ExFFyOPG6vduOVn7cLfvbwhO696XM)

위와같이 jasypt.encryptor.bean을 주입하고 ENC(암호화된 키) 방식으로 사용을 하면 된다.


아니잠깐 그러면 암호화된 키를 만들어야 하는거 아닌가..?


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

public class JasyptConfigDESTest {
    public String key = "3456**";

    @Test
    void stringEncryptor() {
        String url = null;
        String userName = null;
        String password = null;
        String redisPassword = null;

        System.out.println("En_url : " + jasyptEncoding(url));
        System.out.println("En_username : " + jasyptEncoding(userName));
        System.out.println("En_password : " + jasyptEncoding(password));
        System.out.println("En_redisPassword : " + jasyptEncoding(redisPassword));
    }

    @Test
    void stringDecryptor() {
        String url = null;
        String userName = null;
        String password = null;
        String redisPassword = null;

        System.out.println("De_url : " + jasyptDecoding(url));
        System.out.println("De_username : " + jasyptDecoding(userName));
        System.out.println("De_password : " + jasyptDecoding(password));
        System.out.println("De_redisPassword : " + jasyptDecoding(redisPassword));
    }

    public String jasyptEncoding(String value) {
        StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
        pbeEnc.setAlgorithm("PBEWithMD5AndDES");
        pbeEnc.setPassword(key);
        return pbeEnc.encrypt(value);
    }

    public String jasyptDecoding(String value) {
        StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
        pbeEnc.setAlgorithm("PBEWithMD5AndDES");
        pbeEnc.setPassword(key);
        return pbeEnc.decrypt(value);
    }
}

이런식으로 test 코드에 encryptor와 decryptor를 만들어놓으면 가능하다.
stringEncryptor 부분에 암호화하고싶은 암호를 입력하고 test를 수행하자!

profile
Keep forwarding person.

0개의 댓글