✏️ Jasypt 란

  • yml 파일에 특정 값을 암호화해주는 라이브러리
  • 외부 저장소에 프로젝트를 저장하고 공개할 때 민감한 정보를 노출시키지 않기 위해서 사용한다.

✏️ Jaypt 환경설정

📍 dependency

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

📍 application yml 환경설정

  • bean 의 값은 암호화와 복호화를 하는 method 의 name 값을 뜻한다.
jasypt:
  encryptor:
    bean: jasyptStringEncryptor

✏️ 특정 값 암호화 하기

📍 Jasypt 암호화 복호화의 원리

  • 특정 text 를 암호화 하기 위해서 암호키가 필요하다.
    • 암호키는 정해저있지 않고 사용자가 임의로 정하면 된다.
    • 암호화된 코드와 암호키만 갖고있다면 어느환경에서든 Jaypt 으로 복호화를 할 수 있다.
    • 암호화된 코드는 암호화를 할 때 마다 모두 다르게 생성되지만 암호키로 복호화를 하면 항상 같은 text 값을 가리키게 된다.

📍 암호화 하는 방법

🔗 암호화와 복호화 사이트

  • 위 링크에서 Jasypt Online Encryption 는 암호화 하기 Jasypt Online Decryption 는 복호화 하기 이다.
  • Jasypt Online Encryption
    • 첫번째 text 박스에 암호화를 원하는 text 입력
    • 두번째 셀렉 박스는 two way encryption 선택
    • 세번째 text 박스에 임의의 암호키를 입력후 Encrypt 버튼 클릭
    • 네번째 text 박스에 암호화된 코드가 출력된다.
  • Jasypt Online Decryption
    • 암호화된 코드가 잘 작동하는지 확인해보고 싶다면 다시 복호화를 해볼 수 있다.
    • 첫번째에 암호코드, 세번째에 암호키를 입력하면 result 에 우리가 적었던 text 가 출력된다.

⚠️ 만약 사이트에 접속이 안된다면 직접 암호화 복호화 코드를 만드는 방법도 있다.
🔗 암호화 복호화 직접 코딩하기


✏️ Jaypt 적용하기

📍 yml 파일 - 암호코드로 대체

  • yml 파일에 암호화를 하고싶은 값을 암호코드로 대체한다.
    • 이때 암호코드는 ENC(..) 로 감싸줘야 한다.
username: ENC(ll4zKFuVNixjZ6I+y/0RYQ==)
password: ENC(KdhgHp6Vqy9QNQxC3RGcmNWCoTGCZ3tL)
url: ENC(ZomzDT2uG2jDiy69tMpypGRdc2A/lKVA29lyXd05ugV84uVjO6sq4dMvjYqs5RshGNx3RN11Wo63KzDoN7WchJ8NdbGV+NEApNRsG6zyrnB7z3t1Pb9DwehE2uklzmMMndYWUKdRqeNZ5M6+k6rY9u3u6szRDSLPXmVDFFqwgYpxd1bdaRP++w==)

📍 Configuration 설정 - 암호화, 복호화 로직 생성하기

  • @Value
    • 롬복의 value 와는 다른 어노테이션이다.
    • 암호키를 갖고있는 필드에 선언해주면 된다.
    • value 의 속성값으로 암호키를 저장해둘 경로를 입력합니다.
      • 경로는 Run Configuration 에 서 사용될 예정입니다.
  • stringEncryptor
    • 실제로 암호화와 복호화를 진행하는 로직이다.
    • bean 으로 등록시켜주고 bean 이름은 환경설정에서 bean 의 값으로 입력해준 jasyptStringEncryptor 을 입력해주면 된다.
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.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableEncryptableProperties
public class JasyptConfigDES {

		// 암호 키를 저장하는 필드
    @Value("${jasypt.encryptor.password}")
    private String encryptKey;

		// 암호화 복호화가 진행
    @Bean(name = "jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {

        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(encryptKey); // 암호키가 필요한 method -> 암호키 필드를 값으로 전달
        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;
    }
}

📍 암호키 설정하기 - Run Configuration

  • 암호키는 외부에 노출시키면 안되기 때문에 별도로 관리해줘야 합니다.
    • Configuration 에 edite confiurations 선택

  • modify options → Add VM options

  • 새로 생겨난 text box 에 @Value 에 속성값으로 입력해줬었던 경로와 암호키를 작성해준다.
    • 작성 방법은 -D 경로 = 암호키 순으로 입력하면 된다.
-Djasypt.encryptor.password=암호키

  • 이제 암호화된 yml 로 application 을 실행할 수 있다.

📍 암호키 설정하기 - Debug Configuration

  • 하나의 run configuration 으로 실행되는 mian 환경과 달리
    test 환경에서는 debug configuration test method 만큼 존재한다.
    - 즉, test 를 실행시킬 때 debug configuration 가 존재하면 그것으로 실행되지만 존재하지 않다면 자동으로 새로 생성되어 test 가 실행된다.
    - 새로 생성된 configuration 은 당연히 암호키가 설정되어 있지 않아 테스트가 실패한다.
    - 암호키를 설정 후 그 configuration 을 작동시키면 test 가 성공하겠지만,
    또 다른 test 를 작동시키면 마찬가지로 실패하게 된다.
  • 문제를 해결하기 위해서 debug configuration 이 생성 될 때 암호키를 포함한상태로 생성되게 변경해줘야 한다.
    • 왼쪽 하단의 Edit … templatse 선택

  • JUnit 으로 테스트를 진행하고 있기 때문에 junit 을 찾아서 기본값으로 설정해주었다.


  • 이제 test 를 실행할 때 자동으로 생성되는 configuration 도 암호키를 포함한 상태로 생성되게 된다.

⚠️ Jaypt 로 암호화 처리된 프로젝트를 clone 할경우 암호키 가 설정되있지않아 gradle 이 정상적으로 작동되지 않습니다.

  • 즉, 외부에서 아무리 project 를 클론해도 암호키를 모른다면 application 을 실행시킬 수 없게됩니다.
profile
잘못된 내용 PR 환영

0개의 댓글