본문 바로가기

개발/Spring boot

Spring boot - Jasypt를 사용한 프로퍼티 암호화하기

github Repository를 private상태로 두기만 하면 상관이 없지만 가끔씩 public 상태를 두어야 할 때와 Repository에서 CI/CD를 연동해 어플리케이션을 배포해야할 때 중요한 정보들을 Repository에 올려야 하기 때문에 꼭 알아두어야 합니다.

 

1. Jaspyt란?

Jaspyt의 공식문서에는 다음과 같이 설명이 되어 있습니다.

 

"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 라이브러리입니다.

우리가 암호화하는 방식과 작동하는 방법을 몰라도 암호화 기능을 추가할 수 있도록 도와주는 Java 라이브러리입니다.

 

2. 사용하기

1. gradle에 의존성을 추가합니다.

// 암호화 라이브러리
implementation group: 'com.github.ulisesbocchio', name: 'jasypt-spring-boot-starter', version: '3.0.4'

 

2. Jasypt 설정을 Bean에 등록합니다.

 

암호화/복호화에 사용할 키 값을 프로퍼티로 설정하고 Jasypt를 사용하기 위한 Bean을 등록하는 기본 설정입니다.

@Configuration
public class JasyptConfig {

    @Value("${jasypt.encryptor.password}")
    private String password; // 암호화 시 사용될 키 값

    @Bean("jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword(password); // 암호화 키 값
        config.setAlgorithm("PBEWithMD5AndDES"); // 암호 알고리즘
        config.setKeyObtentionIterations("1000"); // PBE 해쉬 횟수
        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;
    }
}

- setAlgorithm(PBEWithMD5AndDES 암호화를 사용합니다.)

- setKeyObtentionIterations(PBE(Password-Based Encryption)를 1000번 해쉬화 한다는 의미입니다.)

- setPoolSize(생성할 암호화기의 풀의 크기를 설정합니다.)

- SetProviderName(암호화를 요청할 보안 공급자의 이름을 설정합니다. 이 공급자는 이미 등록되어 있어야 합니다.디폴트 값 SunJCE)

- setSaltGeneratorClassName(솔트 생성기를 설정합니다. 어떤 솔트 생성기를 사용할지)

- setIvGeneratorClassName(IV 생성기를 설정합니다.)

- setStringOutputType(String이 출력되는 형식을 설정합니다. base64, default, hexadecimal 사용 가능)

 

 

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

 

GitHub - ulisesbocchio/jasypt-spring-boot: Jasypt integration for Spring boot

Jasypt integration for Spring boot. Contribute to ulisesbocchio/jasypt-spring-boot development by creating an account on GitHub.

github.com

해당 Repository를 참고하여 그대로 설정하시면 됩니다.

 

 

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

 

Programming Blog Article Feeds as per your Interest | DevGlan

Best programming article feeds as per your Interest on different technologies. Subscribe to any technology and explore the best articles from around the web.

www.devglan.com

해당 사이트에 접속하시면 암호화/복호화 값을 확인할 수 있습니다.

 

yml 설정파일에 들어간 후 평문이였다면 암호화 후엔 ENC 라는 문자를 붙여주고, 그 안의 괄호에 암호화 된 값을 넣어주면 된다.

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: test1
    password: test2
spring:
  datasource:
    url: ENC(2ndXGiBsJlwePvxYWvxCkAAmxUhvRvzlqQNJdzfLrwG67gM1scjMgFWl9g6d2rW3)
    username: ENC(9JbMLWsitf3lD+RgIuezYw==)
    password: ENC(BAV6R2ZcO61BIdPM0JN9pg==)

해시 특성상 문자열 하나만 바뀌어도 완전히 다른 값처럼 보이는 것을 확인할 수 있습니다.

 

그러나 암호화에 사용하는 키 값(jasypt.encryptor.password)이 application.yml 같은 설정파일에 같이 올라와 있을 경우 중요한 정보를 암호화 하는 의미가 없어지기 때문에 배포할 때는 외부에서 파라미터로 주입받아 실행해야 합니다.

 

3. 외부에서 주입받기

설정 파일이 암호화 된 상태에서는 이와 같이 인자 값을 넘겨주지 않으면 설정 값을 읽어올 수 없기 때문에 외부에서 값을 넣어주어야 서버가 죽지 않고 정상적으로 실행됩니다.

 

1. java -jar 명령어로 어플리케이션 실행 시 전달

java -jar {application.jar} --jasypt.encryptor.password=test

java명령어를 사용해 어플리케이션을 실행하는 경우엔 맨 마지막에 -- 를 사용하여 패스워드를 전달합니다.

{application.jar}부분에는 jar 파일 이름을 넣습니다.

 

2. gradle에서 build 시 test의 프로퍼티로 전달

./gradlew build -Pjasypt.encryptor.password=testkey

 

build 명령어 실행 시 -P를 사용하여 gradle의 환경변수로 넘겨줍니다.

 

build.gradle에 다음과 같이 설정을 추가합니다.

test {
    useJUnitPlatform()
    systemProperty 'jasypt.encryptor.password', findProperty("jasypt.encryptor.password")
}

systemProperty는 키, 값 쌍을 인자로 테스트 수행 JVM의 시스템 프라퍼티 지정하는 메소드입니다.

findProperty를 통해 '-P' 이하로 입력된 속성을 찾아서 JVM의 시스템 프로퍼티로 지정해준다.

위와 같이 사용하면 public Repository에서도 application.yml을 안전하게 보관할 수 있습니다.

 

 

안되는 이유와 해결 방법 추가