Anyway

[Spring] Jasypt로 프로퍼티 암호화하기 본문

Java/Spring

[Spring] Jasypt로 프로퍼티 암호화하기

dyana 2024. 8. 30. 13:19

단순히 코드 저장을 위해 Github에 코드를 올린다 하지만 아무래도 DB user나 pw같은 유출 가능성이 있는 키나 개인 정보들은 암호화해주는 게 좋다. 더군다나 실무에서 이런 키들이 저장소에 올라가게 되면 어떤 일이 일어날지 모른다... 😌 이번에 진행중인 프로젝트 내에서  프로퍼티 암호화를 위해 Jasypt를 처음 써보게 되어 정리한다. 

 

[Jasypt란?]

 Jasypt is a java library which allows the developer to add basic encryption capabilities to his/her projects with minimum effort, and without the need of having deep knowledge on how cryptography works.
출처 : 공식 http://www.jasypt.org/

 

Jasypt 공식 문서를 참고한 바 Jasypt는 개발자가 최소한의 노력으로 자신의 프로젝트에 기본적인 암호화 기능을 추가할 수 있게 해주는 Java 라이브러리이며, 암호화가 작동하는 방식에 대한 심층적인 지식이 없어도 된다고 한다. 

실제로 적용해보자. 

 

 

💁🏻‍♀️암호화하고 싶은 부분

노란색 박스 친 부분으로 

  • Database url
  • Database username
  • Database password
  • jwt-secret

이 네  가지를 암호화하고 싶었다. 

 

 

1️⃣ 라이브러리 추가

현재 프로젝트 내에선 maven으로 개발 중이었기에 pom.xml에 dependency를 추가해줬다.

        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>3.0.5</version>
        </dependency>

 

2️⃣ 프로퍼티를 암호화하여 출력

암호화 하고자 하는 프로퍼티 값을 암호화 하는 과정으로 > run을 하여 암호화된 값을 받기 위한 것이 목적이다.

git에 올릴 땐 지우고 올려줘야 한다. 그대로 올려버리게 되면 이것을 암호화 한 의미가 없어지게 된다. 

public class JasyptUtilMain {
    public static void main(String[] args){
        String localKey = "WdkIEsdkPd"; //랜덤 변수
        String stgKey = "sLEFdckssF";
        String prdKey = "EIsdkcSDfe";

        String enpass = "{암호화 할 변수}";

        System.out.println("* local ---------------------------------------------------->");
        printKey(localKey, enpass);

        System.out.println("* stg ------------------------------------------------------>");
        printKey(stgKey, enpass);

        System.out.println("* prd ------------------------------------------------------>");
        printKey(prdKey, enpass);

    }

    private static void printKey(String key, String enpass){
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        encryptor.setAlgorithm("PBEWithMD5AndDES");
        encryptor.setPassword(key);
        encryptor.setKeyObtentionIterations(1000);
        encryptor.setIvGenerator(new RandomIvGenerator());
        encryptor.setSaltGenerator(new RandomSaltGenerator());
        encryptor.setStringOutputType("base64");
        String encryptStr = encryptor.encrypt(enpass);
        System.out.println("> 텍스트 -> [" + enpass + "]");
        System.out.println("> key -> [" + key + "]");
        System.out.println("> 암호화 -> ENC(" + encryptStr + ")");
        System.out.println("> 복호화 -> [" +   encryptor.decrypt(encryptStr) + "]");
    }

}

 

- 서로 다른 세 가지 환경에서 쓸 거라 key를 local, stg, prd로 나눴으며 이 key는 유출돼서도 잃어버려서도 안 된다 !!

- 각각의 환경에서 암호화 할 {변수}인 enpass

 

만약 username을 암호화하고 싶어 enpass 값에 username을 넣고 코드를 돌리게 되면 

 

암호화 키가 ENC(~) 형태로 나오게 된다. 실제 프로퍼티가 쓰여져야 하는 곳에 이 ENC(~) 값을 넣어주면 된다. 

 

 

3️⃣ 프로퍼티 수정

각각의 키의 암호화 과정을 마쳤으면 그 암호화 키(ENC(~))를 프로퍼티에 넣어준다. 

spring:
  datasource:
    url: ENC(/NqesvJNUZWjE4AwadpTzF7DneGem8Up1F+sdj+vg3qS/VEwBq+OHgzKsFeCcJQ9oVsjbave4U4=)
    driver-class-name: org.postgresql.Driver
    username: ENC(7nwsurvoUPBzbhJnaPjgIIQ0mwpoOg39)
    password: ENC(7nwsurvoUPBzbhJnaPjgIIQ0mwpoOg39)

sbproject:
  jwt-secret: ENC(HYLzRM8mENqzHEIg8cGCJAn1KF7lIenAEFcl0gCAP7peRLOKtbAZCHBDBMND9lU4DCFmPu7aoEpdNNisjUcktWmFrM112tohfeK8YIetumrF1fFJgTR2+g==)

 

4️⃣ application.yaml에 Jasypt 추가

jasypt:
  encryptor:
    algorithm: PBEWithMD5AndDES
    password: ${jasypt.encryptor.password}

 

 

5️⃣ Configuration에 VM option 추가 

Add VM options를 눌러 생긴 박스에 -Djasypt.encryptor.password={암호키} 값을 넣어주면 

이 암호키를 가지고 ENC(~) 값을 복호화 한 값이 실제 프로퍼티에 들어가게 되는 것이다. 

 

{암호키}를 환경변수에 설정할 수도 있다.