티스토리 뷰

Spring

Jasypt를 이용한 properties 암호화

토마's 2018. 11. 2. 11:52

안녕하세요. 오늘은 Spring에서 지원해주는 Jasypt(Java Simplified Encryption)를 이용해서 데이터베이스 접속 정보나, 다양한 설정 정보들을 담아두고 있는 properties 또는, yaml 파일의 정보를 암호화하는 방법에 대해서 포스팅하려고 합니다. properties나 yaml 파일에 각종 정보를을 노출하고 있기 때문에 보안성에 좋지 못해서 암호화하는 것을 추천해드립니다.


1. 우선, pom.xml에 다음과 같이 dependency를 추가해줍니다.

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



2. 원하는 패키지 또는 Config 패키지 하위에 JasyptConfig.java라는 명의 클래스를 생성해줍니다. 

그리고 아래와 같이 작성해줍니다.

@Configuration public class JasyptConfig { private static final String ENCRYPT_KEY = "toma"; @Bean("jasyptStringEncrptor") public StringEncryptor stringEncryptor() { PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword(ENCRYPT_KEY); config.setAlgorithm("PBEWithMD5AndDES"); config.setKeyObtentionIterations("1000"); config.setPoolSize("1"); config.setProviderName("toma"); config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); config.setStringOutputType("base64"); encryptor.setConfig(config); return encryptor; } }

base64 암호화 알고리즘으로 암호화를 수행하고, 암호화/복호화를 수행할 때의 키 값으로는 "toma"를 사용하도록 설정했습니다.



3. 자바 파일을 만들고 난뒤 자바 빈으로 등록해주었던 "jasyptStringEncrptor"라는 이름을 properties 또는 yaml 파일에 다음과 같이 작성해줍니다.

# jasypt encryptor
jasypt.encryptor.bean=jasyptStringEncrptor


4. 기존에 데이터베이스 접속 정보는 아래와 같습니다.

spring.datasource.url=jdbc:mysql://localhost:3306/toma
spring.datasource.username=toma
spring.datasource.password=toma



5. 다음은 간단한 예제를 통해서 위의 접속 정보들을 암호화를 진행해보도록 하겠습니다.

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;

public class EncryptTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		StandardPBEStringEncryptor pbeEnc = new StandardPBEStringEncryptor();
		pbeEnc.setAlgorithm("PBEWithMD5AndDES");
		pbeEnc.setPassword("toma");
		
		String url = "jdbc:mysql://localhost:3306/toma";
		String username = "toma";
		String password = "toma";
		
		System.out.println("기존  URL :: " + url + " | 변경 URL :: " + pbeEnc.encrypt(url));
		System.out.println("기존  username :: " + username + " | 변경 username :: " + pbeEnc.encrypt(username));
		System.out.println("기존  password :: " + password + " | 변경 password :: " + pbeEnc.encrypt(password));
	}

}


위의 코드 수행 결과는 아래와 같습니다.




6. 위에서 암호화된 접속 정보를 사용하는 방법은 아래와 같은 문법으로 사용하면 됩니다.  


- 문법 : ENC(암호화된 값)

- example : ENC(Gxloau1Q4SIPesrGOMaUhQ==)와 같이 properties 또는 yaml 의 정보들을 다음과 같이 변경해주면 됩니다.




이상으로 properties 또는 yaml 파일을 통해 노출되기 쉬운 접속정보 및 각종 설정 파일들을 암호화 하는 방법에 대해서 알아봤습니다. 물론 다른 방법도 있겠지만 다른 방법들 또한 직접 실행해보고 차차 포스팅하도록 하겠습니다.


참고사이트) https://github.com/ulisesbocchio/jasypt-spring-boot 또는 http://www.jasypt.org/