새소식

300x250
2. 웹개발/스프링부트_ETC

[스프링부트] Spring Boot 설정파일(yaml, properties) 암호화 (with Jasypt)

  • -
728x90

[스프링부트] Spring Boot 설정파일 암호화 (with Jasypt)

안녕하세요. 갓대희 입니다. 이번 포스팅은 [ Spring Boot 설정파일 암호화 하기 입니다. : )

 

 

※ application.yml 이나 application.properties 파일에 DB의 비밀번호 또는 키 값을 명시해두는 경우 중요한 값들이 외부로 노출되어 보안에 심각한 문제를 초래할 수 있다.

 

 예를 들어 로컬 DB만으로 작업한다면 서버주소가 lcoalhost이기 때문에, github과 같은 저장소에 id와 pw가 유출되어도 치명적으로 작용하지 않는다.
 하지만, 실배포의 경우 대부분 외부 DB에 접근하기 때문에 id, pw, 서버주소까지 노출되면 위험하다.
 AWS로 운영하려고 해도 자체에서도 보안 정책상 막는것으로 알고 있다.

 

다음의 스프링 부트 db 접속 정보 설정 예시를 보자.

ex) application.yml

spring:
  datasource:
	driverClassName: com.mysql.cj.jdbc.Driver
    url: ##DB위치
    username: ##이름
    password: ##패스워드

물론 설정파일(.yml or properties)을 gitignore을 통해 올리지 않고, 서버에 파일로 관리하는 방법도 있지만,

이번엔 암호화해서 관리하는 방법을 말하고자 한다. :-)

 

1. Jasypt

Jasypt(Java Simplified Encryption)는 자신의 프로젝트(Java 어플리케이션)에서 설정 파일의 속성 값들을 암호화, 복호화할 수 있는 라이브러리라고 볼 수 있다.

※참고 http://www.jasypt.org/

 

이번엔 springBoot 환경 설정 파일의 민감정보를 암호화 하여 관리하며, 환경변수를 통해 복호화키를 설정하여 사용할 수 있게 해보자. 

※ 참고

PBEWithMD5AndDES 암호화 방식을 사용하는 경우 하기 WebPage에서도 간단하게 암,복화화 테스트가 가능하긴 하다.

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

 

 

이제 SpringBoot에서 이를 사용해 보자. 

Dependency 추가

 - 현재 최신 버전은 3.0.5 이다. - gradle의 경우 

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

 - maven의 경우

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

 

Encryptor Configuration

 - 암호화 알고리즘 (Algorithm) : 3.0 버전 부터 기본 알고리즘이 PBEWithMD5AndDES → PBEWITHHMACSHA512ANDAES_256로 변경 되었다.

 - 이외 비공개 키, 인코딩(encoding) 타입, 솔트(salt) 값 생성기 등을 설정할 수 있는데 다음을 참고 하자.

https://github.com/ulisesbocchio/jasypt-spring-boot

 - 혹시 아직 2.0 예전 버전을 사용하는 경우를 고려하여 하기 2가지 암호화 방식 모두 사용 할 수 있도록 예제를 만들어 보자.

1) PBEWITHHMACSHA512ANDAES_256

2) PBEWithMD5AndDES

 

JasyptConfig 클래스

 - 빈 이름은 기본 값은 하기와 같다.

@Bean(“jasyptStringEncryptor”)

 - 풀 사이즈의 기본 값은 1이라고 되어 있지만, 없는 경우 예외가 발생하여 난 1로 지정하였다.

 

2. 예제
PBEWITHHMACSHA512ANDAES_256 알고리즘 사용

1. config 등록

ex) JasyptConfigAES.java

 - jasyptEncryptorAES로 Bean을 등록하여 application.yml의 jasypt bean으로 등록할 때 사용한다.

@Configuration
@EnableEncryptableProperties
public class JasyptConfigAES {

	@Bean("jasyptEncryptorAES")
	public StringEncryptor stringEncryptor() {
		PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
		SimpleStringPBEConfig config = new SimpleStringPBEConfig();

		config.setPassword("gdh-password"); // 암호화키
		config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256"); // 알고리즘
		config.setKeyObtentionIterations("1000"); // 반복할 해싱 회수
		config.setPoolSize("1"); // 인스턴스 pool
		config.setProviderName("SunJCE");
		config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); // salt 생성 클래스
		config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        config.setStringOutputType("base64"); //인코딩 방식
		encryptor.setConfig(config);
		return encryptor;
	}
}

 

2. 테스트

 

ex) jasyptConfigAESTest.java

class JasyptConfigAESTest {

	@Test
	void stringEncryptor() {
		String url = "db_url"; 
		String username = "db_username";
		String password = "db_password";

		System.out.println(jasyptEncoding(url));
		System.out.println(jasyptEncoding(username));
		System.out.println(jasyptEncoding(password));
	}

	public String jasyptEncoding(String value) {

		String key = "my_jasypt_key";
		StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
		pbeEnc.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
		pbeEnc.setPassword(key);
		pbeEnc.setIvGenerator(new RandomIvGenerator());
		return pbeEnc.encrypt(value);
	}
}

 - 테스트를 수행하여 url, username, password 각각 3개의 결과물을 확인하여 설정 파일에 사용 할 것이다.

 

ex) application.yml

jasypt:
  encryptor:
    bean: jasyptEncryptorAES

spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: ENC(암호화된 url)
    username: ENC(암호화된 username)
    password: ENC(암호화된 password)

 - 이후 스프링 기동 시 정상적으로 db 접속 정보를 적용 가능한 것을 확인 하면 된다.

 

PBEWithMD5AndDES

 

1. config 등록

ex) JasyptConfigDES.java

 - jasyptEncryptorDES로 Bean을 등록하여 application.yml의 jasypt bean으로 등록할 때 사용한다.

@Configuration
@EnableEncryptableProperties
public class JasyptConfigDES {

	@Bean("jasyptEncryptorDES")
	public StringEncryptor stringEncryptor() {
		PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
		SimpleStringPBEConfig config = new SimpleStringPBEConfig();
		config.setPassword("gdh-password"); // 암호화키
		config.setAlgorithm("PBEWithMD5AndDES"); // 알고리즘
		config.setKeyObtentionIterations("1000"); // 반복할 해싱 회수
		config.setPoolSize("1"); // 인스턴스 pool
		config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); // salt 생성 클래스
		config.setStringOutputType("base64"); //인코딩 방식
		encryptor.setConfig(config);
		return encryptor;
	}
}

 

2. 테스트

ex) jasyptConfigDESTest

class JasyptConfigDESTest {

	@Test
	void stringEncryptor() {
		String url = "db_url";
		String username = "db_username";
		String password = "db_password";

		System.out.println(jasyptEncoding(url));
		System.out.println(jasyptEncoding(username));
		System.out.println(jasyptEncoding(password));
	}

	public String jasyptEncoding(String value) {

		String key = "my_jasypt_key";
		StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
		pbeEnc.setAlgorithm("PBEWithMD5AndDES");
		pbeEnc.setPassword(key);
		return pbeEnc.encrypt(value);
	}
}

 - 테스트를 수행하여 url, username, password 각각 3개의 결과물을 확인하여 설정 파일에 사용 할 것이다.

 

ex) application.yml

jasypt:
  encryptor:
    bean: jasyptEncryptorAES

spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: ENC(암호화된 url)
    username: ENC(암호화된 username)
    password: ENC(암호화된 password)

 - 이후 스프링 기동 시 정상적으로 db 접속 정보를 적용 가능한 것을 확인 하면 된다.

 

이로써 2가지 jasypt 사용예시를 확인해보았고, 혹시 신규 버전의 경우 잘못 작성된 내용이 있다면, 댓글 부탁 드립니다.

300x250
Contents

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

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