아무거나

[Spring boot] Jasypt를 활용한 Application Property 암호화 본문

Java & Kotlin/Spring

[Spring boot] Jasypt를 활용한 Application Property 암호화

전봉근 2020. 12. 14. 01:23
반응형

Library Document

Jasypt를 활용한 Application Property 암호화

Application.yml 에다 보통 DB 접속정보등의 데이터가 기재되어있다. 이러한 내용을 외부에서 탈취해갈 위험성을 대비하여 jasypt를 활용하여 보안을 강화하자

  • http://www.jasypt.org/download.html 에서 jasypt 다운 (1.9.2 버전 기준)
  • 압축 풀고 cmd에서 bin 폴더로 이동 (./file/jasypt-1.9.3/bin)
  • encrypt input="bkjeontest!@" password="bkjeon!@" algorithm="PBEWITHMD5ANDDES" (온라인 암/복호화 사이트 https://www.devglan.com/online-tools/jasypt-online-encryption-decryption)
    • Output) ig/i7xWXbv9Ss+GIQFm7Vk2RwUlQRBTb -> application.yml 에 정의 되어 있음 ENC라고 괄호안에 암호화된 패스워드를 넣으면 된다. (ENC로 해야 암호화된 문자열을 인식한다)

       

        ENC(ig/i7xWXbv9Ss+GIQFm7Vk2RwUlQRBTb)
      
    • 또는 해당 API에서 encrypt된 값으로도 사용가능
    • 1~3 encrypt 과정으로 해도되고 해당 sample code에서 제공하는 EncryptionController 에서 encrypt 값을 사용해도 된다.
  • jasyptEncryptConfig 작성
      import lombok.extern.slf4j.Slf4j;
      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;
    
      @Slf4j
      @Configuration
      public class jasyptEncryptConfig {
    
          @Bean("jasyptStringEncryptor")
          public StringEncryptor jasyptStringEncryptor() {
              String passwordKey = System.getProperty("jasypt.encryptor.password");
              if (passwordKey == null) {
                  throw new RuntimeException();
              }
    
              PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
              SimpleStringPBEConfig config = new SimpleStringPBEConfig();
              config.setPassword(passwordKey);
              config.setAlgorithm("PBEWithMD5AndDES");
              config.setKeyObtentionIterations("1000");
              config.setPoolSize("1");
              config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
              encryptor.setConfig(config);
    
              return encryptor;
          }
    
      }
    
  • gradle 의존성 추가
      ...
        // 만약 오류가 나면 spring 버전이나 jdk 버전 호환여부를 확인하자
        // jasypt encrypt
        compile group: 'com.github.ulisesbocchio', name: 'jasypt-spring-boot-starter', version: '3.0.3'
      ...
    
  • application.yml 에 내용 추가 (jasypt bean 활성화)
      ...
        jasypt:
          encryptor:
            bean: jasyptStringEncryptor
      ...
    
  • passwordKey 는 VM Option 에 넣어준다. ( -Djasypt.encryptor.passwordKey=bkjeon!@ )
  • Sample Code
      public void getJasyptEncryptProperties() {
          try {
              StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
              pbeEnc.setPassword(System.getProperty("jasypt.encryptor.password"));
              pbeEnc.setAlgorithm("PBEWithMD5AndDES");
    
              // 암호화, 복호화
              String encrypt = pbeEnc.encrypt("wjsqhdrms");
              String decrypt = pbeEnc.decrypt(encrypt);
              if (log.isInfoEnabled()) {
                  log.info("encrypt: {}, decrypt: {}", encrypt, decrypt);
              }
          } catch (Exception e) {
              if (log.isErrorEnabled()) {
                  log.error("getJasyptEncryptProperties ERROR {}", e.getMessage());
              }
          }
      }  
    
반응형
Comments