[Spring] Properties 암호화

iniestar·2022년 4월 22일
0

Spring 에서는 설정 파일에 들어가는 JDBC 접속 정보(ID, Password)를 평문이 아닌 암호문을 입력하여 접속정보를 일부 보호할 수 있는 암호화 기능을 제공하고 있다. 이 글에서는 jasypt 라이브러리를 이용한 암호화를 구현해본다.

1. jasypt 라이브러리란?

간단히 말하면 Java, Spring 등에서 암복호화를 지원해주는 오픈소스라고 할 수 있다. 개발자 입장에서는 최소한의 코드로 암복호화를 사용할 수 있는 것이다!

2. 사용 방법

1) Spring bean 등록

먼저, bean으로 등록하기 위해 별도 클래스를 만들고 @Configuration을 달아보자

@Configuration
public class JasyptConfig {

    @Value("${jasypt.encryptor.password}")
    private String password; // 암호화 시 사용될 키 값

그리고 @Bean 을 선언하여 실제로 암/복호화를 적용할 함수를 만든다.

@Bean("jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(password); // 암호화 키 값
        config.setAlgorithm("PBEWithMD5AndDES"); // 암호 알고리즘
        config.setKeyObtentionIterations("1000"); // PBE 해쉬 횟수
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        return encryptor;

위에서 사용된 값들은 기본 값으로 사용되며, 변경이 가능하다.

2) properties or yml 설정

프로그램 기동 시 암호화 적용을 위해 해당 bean을 설정 파일에 명시해야하며 아래와 같이 설정 할 수 있다.

jasypt:
  encryptor:
    property:
      bean: jasyptStringEncryptor      

3) 암호화 값 얻기

당연한 얘기지만, 설정 파일의 암호화 값을 입력하기 위하여 jasypt 라이브러리를 이용하여 암호화 값을 얻어야 한다. 암호화 방법은 아래와 같다.

public void getEnc() {
StandardPBEStringEncryptor standardPBEStringEncryptor = new StandardPBEStringEncryptor();
standardPBEStringEncryptor.setAlgorithm("PBEWithMD5AndDES");
standardPBEStringEncryptor.setPassword("TEST_KEY");
String enc = standardPBEStringEncryptor.encrypt("password123");
System.out.println("Encrypted Password is : "+ enc);
}

4) 암호화 값 입력

도출한 암호호 값을 properties 또는 yml에 있는 jdbc 입력란에 암호화 값을 ENC()으로 감싸 입력한다.

db.driver=com.mysql.jdbc.Driver
db.url=ENC(dA5m1XXzMMqixudUjoPtve6hSrKnNgDnG6yXytBcnoSzPx46zNl32Q7y1gvI3jMB)
db.username=ENC(X3scraZNomhTtGD8QAndPw==)
db.password=ENC(eGaAQsn3ejXTMusZjl78sg==)

마치며...

보안 요구사항이 나날이 필요해지는 시대에 이런 잡기술은 필수이다!!

profile
while(true) { 손가락 관절염++ };

0개의 댓글