본문 바로가기
portfolio/게시판 만들기

Jasypt를 사용하여 properties(yml) 주요 정보 암호화

by LeeGangEun 2023. 7. 9.

Jasypt

먼저 yml 파일은 양방향 암호화가 가능해야 한다.
그 중 많이 사용하는 라이브러리인 Jasypt(Java Simplified Encryption) 를 적용해보자.

왜 ?

왜 암호화를 해야하는지 의문이 들 수 있을 것 같다.
클라우드 환경에서 RDS를 사용하고 있고 해당 정보를 yml 파일로 관리하고 있다고 가정해보자.
이 경우, 형상 관리 시에 항상  .gitignore로 설정하여 커밋하지 않거나 private 프로젝트로 진행한다면 문제가 없을 수도 있다.
하지만 public 프로젝트와 더불어 내 yml 파일을 커밋했다면 ? 
나의 RDS 정보가 그대로 노출 될 수 있는 심각한 문제가 발생할 수 있다. 
따라서 우리는 암호화를 진행해야 한다.

dependency 추가 

implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'
implementation 'org.bouncycastle:bcprov-jdk15on:1.70' // AES 암호화 알고리즘을 제공해주는 라이브러리

https://liveyourit.tistory.com/196   

 

[암호학] DES vs AES 암호화 알고리즘, 방식 및 차이

leeforest 정보보안/IT 공부 블로그입니다. # 틀린 부분 지적 환영 # 질문 환영 # 댓글 환영

liveyourit.tistory.com

 

JasyptConfig Class 생성

package com.devblog.config;

import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;

@Configuration
@EnableEncryptableProperties
public class JasyptConfig {
    @Bean("jasyptEncryptor")
    public StringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();

        encryptor.setProvider(new BouncyCastleProvider());
        encryptor.setPoolSize(2);
        encryptor.setPassword(getJasyptEncryptorPassword()); // 암호화 키
        encryptor.setAlgorithm("PBEWithSHA256And128BitAES-CBC-BC"); // 알고리즘

        return encryptor;
    }

    private String getJasyptEncryptorPassword() {
        try {
            ClassPathResource resource = new ClassPathResource("jasypt-encryptor-key.txt");
            return String.join("", Files.readAllLines(Paths.get(resource.getURI())));
        } catch (IOException e) {
            throw new RuntimeException("Not found Jasypt password file.");
        }
    }
}

 

여기서 암호화 키값을 지정해줄 수 있는데,
키값을 노출하면 암호화한 의미가 없다.
키값을 다른 파일에서 관리하고 그 파일을 읽어 가져오는 형식으로 적용해야한다.

jasypt-encryptor-key.txt 생성

1. /src/main/resource에 위 파일을 생성해준다.
2. 내가 원하는 key값 입력

암호화 적용

암호화를 위해 먼저 테스트 코드를 생성해야한다.

@SpringBootTest
class JasyptConfigTest {

    final BeanFactory beanFactory = new AnnotationConfigApplicationContext(JasyptConfig.class);
    final StringEncryptor stringEncryptor = beanFactory.getBean("jasyptEncryptor", StringEncryptor.class);

    @Test
    @DisplayName("암복호화 테스트")
    void encryptorTest() {
        String keyword = "암호화하고 싶은 값 입력";
        String enc = stringEncryptor.encrypt(keyword);
        String des = stringEncryptor.decrypt(enc);
        assertThat(keyword).isEqualTo(des);
    }

위에 코드를 통해 암호화 한 값(enc)를 추출 후 
yml에 적용해주자

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/dev-blog
    username: root
    password: ENC(QOXXbU9F0FgXSp3MhZfaDjWdAOAZjRc0C3EeOnuo7HQ=)
	
    # ENC() 입력 후 소괄호 안에 암호화 된 데이터를 넣어주면 된다.


스프링 실행시 정상적으로 암호화가 처리된 걸 확인할 수 있다 !

 

참고자료

https://www.baeldung.com/spring-boot-jasypt

'portfolio > 게시판 만들기' 카테고리의 다른 글

Pageable 이용한 페이징  (0) 2023.08.13
게시판 crud 작업  (0) 2023.07.10
프로젝트 설계  (0) 2023.07.09