[프로젝트] 프로퍼티 암호화를 적용해보자

dohyun-dev·2023년 7월 12일
1

프로젝트

목록 보기
3/4
post-thumbnail

서론

SSAFY 공통프로젝트 할 당시 다른 팀에 데이터베이스가 해킹 당하고 여러 사건, 사고들이 있어서 보안에 관련해서 많은 고민을 하였다.

문제는 application.yml 파일에 DB와 apikey와 같은 민감정보들이 github를 통해 올라가면 안된다는 점이었다.

우리 팀은 당시 application.yml 파일을 git ignore하고 mattermost 팀 채널을 통해 주고 받는 방법으로 해결하였다. 당시 application.yml에 수정이 일어나면 팀원들에게 알리고 해당 파일을 다시 공유하면서 많은 불편함이 있었다.

spring cloud를 공부하면서 spring cloud config 통해 yml 파일을 관리하는 방법을 알게되었고 다른 방법은 없을까 검색을 해보았다.

Jasypt를 통해 프로퍼티 파일을 암호화할 수 있는 것을 알게된 후 적용할려고 한다.

Jasypt

https://github.com/ulisesbocchio/jasypt-spring-boot

사용법

인터넷에 많은 예제를 찾아보고 공식문서도 읽어보았다.

인터넷 예제들을 StringEncryptor를 직접 빈으로 등록해서 사용하는 방법을 사용하는 예제가 많았다.

JasyptSpringbootAutoConfig를 지원한다고 한다.

해당 속성을 가진 StringEncryptor을 자동으로 등록해준다고 한다.

→ 자동 구성으로 생성한 StringEncryptor를 사용할려고 하면 정체모를 오류가 생겨서 custom으로 StringEncryptor를 구성해줬다.

이유를 아시는 분은 댓글로 부탁드립니다 ㅠㅠ

  1. jasypt.encryptor.password 를 먼저 등록해주어야 한다

    • 환경변수로 미리 등록한 후 yaml파일에 바인딩 하는 방법으로 등록했다.
      jasypt:
        encryptor:
          password: ${JASYPT_PASSWORD}
  2. StringEncryptor를 빈으로 등록해준다

    JasyptConfig.class

    package com.ssafy.aejimeongji.config;
    
    import org.jasypt.encryption.StringEncryptor;
    import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
    import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class JasyptConfig {
    
        private final String password;
    
        public JasyptConfig(
                @Value("${jasypt.encryptor.password}")  String password
        ) {
            this.password = password;
        }
    
        @Bean
        public StringEncryptor jasyptStringEncryptor() {
            PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
            SimpleStringPBEConfig config = new SimpleStringPBEConfig();
            config.setPassword(password);
            config.setAlgorithm("PBEWithMD5AndDES");
            config.setKeyObtentionIterations("1000");
            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;
        }
    }
    • @EnableEncryptableProperties 를 추가하면 @ValueEnviorment 객체에 접근할 때 복호화된 결과를 바로 받을 수 있다고 되어있다.
  3. 스프링 property를 등록할 때 ENC(”암호화한 값”) 이러한 방법으로 값을 넣으면 된다.

    jasypt:
      encryptor:
        password: ${JASYPT_PASSWORD}
        bean: jasyptStringEncryptor
    
    test:
    	text: ENC(암호화한 값)
    • jasypt.encryptor.bean 에는 StringEncryptor의 빈의 이름을 등록하면 되는데 default 값이 jasyptStringEncryptor 라서 빈의 이름을 똑같이 생성한다면 생략해도 된다.

기타

해당 문서를 보면 대칭, 비대칭 암호화 모두 지원하는 것 같다.

0개의 댓글