마니의 공부방/Java

[Spring] yml 암호화 - @ConfigurationPropertiesBinding 사용

properties 파일과 yml에 db password등을 평문 상태로 입력해두는 경우 보안에 문제가 될수 있습니다.

이에 중요 데이터는 properties나 yml등의 설정파일에 암호화하여 기입하고, 처음 기동시 복호화 하여 사용하는 경우가 있습니다. 

 

물론 제가 했던 프로젝트에서도 이와 같은 경우가 있어서, 정리한 내용을 공유합니다.

 

■ 암호 데이터 확인 ※ 아래 방법은 AES 128을 통해 암호화하였습니다.

[springboot 설정]

@Component
@ConfigurationPropertiesBinding
public class PrePropertiesConfig implements Converter<String, String> {
  private static String encKey = "1234567890123456";

  @Override
  public String convert(String source) {
      if(source==null){
          return null;
      }
      System.out.println("========================");
      System.out.println(source);

      if(source.startsWith("ENC")){
        source = source.replace("ENC", "");
            String decStr = EncUtil.decAES128(encKey, source);
            System.out.println("source:"+source + "/dec:"+decStr);
      }
      System.out.println("========================");
      return source;
  }
}

config(yml)의 value가 'ENC'로 시작하는 경우, 암호화 데이터로 간주

복호화 진행

예시) 

========================

ENC87435e287f54223030cd79a4de12a011

source: 87435e287f54223030cd79a4de12a011 / dec:pass0001!

========================

 

■ 암호 데이터 확인 ※ 아래 방법은 윈도우의 cmd창을 통한 확인 방법

[확인프로그램 설치]

http://www.jasypt.org/download.html 에서  DOWNLOAD JASYPT (from SourceForge.net)  클릭하여 다운로드

압축을 풀고, 이하 bin 폴더를 환경변수로 설정한다.

encrypt input="111" password="pwkey" algorithm="PBEWITHMD5ANDDES" 

 

example--

시험환경에서는 환경변수로 설정하였음

C:\Users\cruxon>encrypt input="111" password="pwkey" algorithm="PBEWITHMD5ANDDES"

----ENVIRONMENT-----------------

Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.111-b14

----ARGUMENTS-------------------

algorithm: PBEWITHMD5ANDDES

input: 111

password: pwkey

----OUTPUT----------------------

mVS9dErmUzx1osNWylsO+A==

 

■ 암호 데이터 확인 ※ 아래 방법은 자바프로그램을 통한 확인 방법

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;

public class JasyptTest {
    public static void main(String[] args) {
        StandardPBEStringEncryptor jasypt = new StandardPBEStringEncryptor();
        jasypt.setPassword("pwkey");      //암호화 키(password)
        jasypt.setAlgorithm("PBEWithMD5AndDES");
      
      	String encryptedText = jasypt.encrypt("111");    //암호화
        String plainText = jasypt.decrypt(encryptedText);  //복호화
        
        System.out.println("encryptedText:  " + encryptedText); //암호화된 값
        Systemout.println("plainText:  " + plainText);         //복호화된 값
    }
}

 

■ Springboot 설정

[pom.xml]

<dependency>

    <groupId>com.github.ulisesbocchio</groupId>

    <artifactId>jasypt-spring-boot-starter</artifactId>

    <version>1.16</version>

</dependency>

 

[application.yml] - 암호화할 필드에 ENC()를 사용하여 괄호안에 암호화 데이터를 입력

ENC(%enc-text%)

example ---

iot:

    service-availability: ENC(mlLPdCFwQy+jh6VY0Ha30Q==)

 

[암복호화 키 설정]

1. Vm 옵션설정 ※ program arguments가 아님

-Djasypt.encryptor.password=pwkey

 

2. 시험환경에서 yml에 키 설정시

application.properties

jasypt.encryptor.password=pwkey #패스워드 직접 설정

 

[적용 결과 확인]

 Application.java > main 메서드 아래에 해당 내용으로 설정내용을 확인할수 있다.

public static void main(String[] args) {
      ConfigurableApplicationContext context = new  SpringApplicationBuilder(Application.class).run(args);
      log.info("[active profile]=====> " +  Arrays.asList(context.getEnvironment().getActiveProfiles()));
      ServiceSetting bean = context.getBean(ServiceSetting.class);

      System.out.println("==================================");
      System.out.println(bean.toString());
      System.out.println("==================================");
}