공부/Spring

[Spring] jasypt 사용하기

작은소행성 2023. 10. 5. 22:05

jasypt란

jasypt , 자시프트라고 읽는다고 한다. 

jasypt 는 자바 라이브러리로 쉽게 암호화 기능을 사용할 수 있도록 한다. 

DB 계정이나 중요한 키값을 평문으로 올리는 것이 아닌 암호화해서 올릴 수 있게하는 라이브러리로

스프링 프로젝트의 application.yaml 에서 중요 정보를 암호화할 때 많이 사용된다. 

 

 

의존성 추가하기 

mvn repository 에서 원하는 버전을 선택한다. 

https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter

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

 

 

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
@EnableEncryptableProperties
public class JasyptConfig {

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

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

 

@Configuration 으로 빈을 등록해준다. 

PBEWithMD5AndDES 암호화 알고리즘 
PBE는 암호 기반 암호화 알고리즘이다. 
패스워드를 기반으로 해서 만든 키로 암호화를 수행하는 방법이다. 

 

 

암호화 하기 

사이트를 통해 텍스트 암호화 하기 

jasypt 암호화/복호화를 해주는 사이트가 있다. 

 

plain text 에 암호화하고 싶은 텍스트 입력

two way excryption을 선택해주고 

밑에 secret key를 입력해주면 된다. 

 

yaml 에 암호화된 데이터 입력하기 

암호화된 코드는 ENC()로 감싸줘야 한다.

#DB
spring:
  datasource:
    host: localhost:3306
    database: test
    username: root
    password: 1234!
    
#DB-jasypt
spring:
  datasource:
    host: ENC(wbCLoCPFfAJwUZETSQrwxieCXJmoYiCF)
    database: ENC(ufmx0rBJGBkqJ9CqlPYC7g==)
    username: ENC(Aq4qI0FVx07nXTW3d0iZ4A==)
    password: ENC(gChC+b0AJfNp/QHJGOurHw==)

 

 

Password 전달하기 

암호화한 키를 스프링 내부 프로퍼티(application.yaml)에 저장하면 암호화한 의미가 없기때문에 

외부 프로퍼티나 실행 인자값으로 받는다. 

 


jar 구동

-Djasypt.encryptor.password=jasypt_password.!

-D{yaml 에 작성된 경로}={비밀번호}

 

war 구동

## 톰캣 실행 VM 인자값으로 사용할 때
-Djasypt.encryptor.password=jasypt_password.!

## catalina.properties를 사용할 때
톰캣 폴더/conf/catalina.properties
jasypt.encryptor.password=jasypt_password.!

 

Dockerfile

...
ENTRYPOINT ["java", "-Dsun.net.inetaddr.ttl=0", "-Djasypt.encryptor.password=jasypt_password.!", "-jar", "/home/app.jar"]

 

 

 

Intellij 에서 VM Options 적용 

Edit Configuration 에서 VM options 를 추가하고 

-Djasypt.encryptor.password=비밀번호 를 입력한다. 

혹은 

Environment variables 에 해당 정보를 추가한다

 

 

 

 

 

참고 

https://github.com/ulisesbocchio/jasypt-spring-boot#use-you-own-custom-encryptor

 

반응형