새소식

반응형
Java/Spring Boot

.properties 데이터 암호화 - jasypt 암호화

  • -
728x90
반응형

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.

Jasypt는 개발자가 암호화 작동 방식에 대한 깊은 지식이 없어도 최소한의 노력으로 프로젝트에 기본 암호화 기능을 추가할 수 있는 자바 라이브러리입니다.

쉽게 말해 Java 프로젝트 내에 작성된 .properties 파일(설정 파일) 등을 암호화 하기 위한 Java 라이브러리이다.

 

구성 환경 : Spring Boot, Maven

 

1. jasypt dependency 추가

pom.xml에 jasypt 라이브러리 추가를 위한 dependency를 설정한다.

pom.xml
<!-- https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter -->
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.4</version>
</dependency>

pom.xml 의 <dependencies></dependencies> 에 위 내용을 추가한다.

추가 후 프로젝트 마우스 오른쪽 클릭 > MAVEN > Update Project... 로 라이브러리를 다운받는다.

 

2. application.yml 에 jasypt 설정 추가

applcation.yml에 jasypt 관련 설정을 추가한다.

 

application.yml
jasypt:
  encryptor:
    bean: jasyptStringEncryptor
    password: klxjvklalsdf

spring: 과 같은 라인이므로 맨 밑에 추가해준다.

 

3. Jasypt 사용을 위한 JasyptConfig 파일 설정

JasyptConfig 라는 클래스를 생성한다.

 

JasyptConfig.java

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 {

    @Value("${jasypt.encryptor.password}")
    private String JASYPT_KEY;

    @Bean("jasyptStringEncryptor")
    public StringEncryptor stringEncryptor(){
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(JASYPT_KEY);
        config.setPoolSize("1");
        config.setAlgorithm("PBEWithMD5AndDES");
        config.setStringOutputType("base64");
        config.setKeyObtentionIterations("1000");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        encryptor.setConfig(config);
        return encryptor;
    }
}

 

@Value("${jasypt.encryptor.password}")
    private String JASYPT_KEY;

application.yml 의 설정값을 가져오기 위해 @Value 어노테이션을 사용한다.

 

PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();

 

Jasypt를 사용하기 위해 Bean 등록을 한 메서드를 보면 return 이 StringEncryptor 이다.

StringEncryptor 는 Jasypt 공식 홈페이지에서 설명은 아래와 같다.

 

"Common interface for all Encryptors which receive a String message and return a String result."

"String 메시지를 수신하고 String 결과를 반환하는 모든 Encryptor에 대한 공통 인터페이스입니다."

 

라고 한다.

 

StringEncryptor는 인터페이스이며 StringEncryptor 인터페이스를 구현한 클래스는 아래와 같다.

 

위를 살펴보면 여러가지의 구현한 인터페이스 및 클래스들이 있다.

우리가 사용하는 PooledPBEStringEncryptor 는 PBEStringCleanablePasswordEncryptor 인터페이스를 구현했다.

 

PBEStringCleanablePasswordEncryptor 인터페이스는 아래와 같이 설명되어 있다.

Common interface for all Password Based Encryptors which receive a String message and return a String result, and provide means to set passwords as cleanable char[] objects (instead of immutable Strings).

For a default implementation, see StandardPBEStringEncryptor

 

문자열 메시지를 수신하고 문자열 결과를 반환하고 암호를 변경 불가능한 문자열 대신 청소 가능한 char[] 개체 로 설정하는 수단을 제공하는 모든 암호 기반 암호화기에 대한 공통 인터페이스입니다 .

기본 구현에 대해서는 StandardPBEStringEncryptor 를 참조하십시오 

 

위 내용과 같이 기본 구현은 StandardPBEStringEncryptor 클래스라고 한다.

StandardPBEStringEncryptor 클래스를 사용하여 암호화 할 수 있지만 PooledPBEStringEncryptor 클래스를

사용하는 이유는 pooling 이다.

 

PooledPBEStringEncryptor 클래스는 내부적으로 StandardPBEStringEncryptor 를 설정한 poolsize만큼

가지고 있다가 요청이 오면 순서대로 pool에서 encryptor를 사용하게 된다.

 

 

4. .properties 파일에 사용할 정보 암호화 설정

 

사용할 데이터를 아래 jasypt 변환 무료사이트에서 암호화한다.

https://www.devglan.com/online-tools/jasypt-online-encryption-decryption

 

본인은 "abcdefg123" 으로 사용할 properties 데이터를 암호화했다.

Secret Key 는 application.yml에서 설정했던 password 값을 사용한다.

 

암호화된 데이터를 properties 파일에 ENC()로 감싸서 설정한다.

 

5. 데이터 사용해보기

데이터를 properties 파일에서 가져오기 위해 @Value 어노테이션을 사용한다.

 

properties에서 설정한 jasypt.pt.value 값을 가져오면 복호화되어 평문데이터가 보이는걸 확인할 수 있다.

 

 

728x90
반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.