본문 바로가기

자바

jasypt 라이브러리를 이용해 민감정보 숨기기 [Java, Spring Boot, jasypt]

반응형

github에 프로젝트를 올리려고 했는데, 생각해보니 그대로 올리면 DB정보같은 게 200% 문제가 될 것 같았다.

그래서 어떻게든 DB관련 정보를 숨기기로 했다.

 

라이브러리

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

 

ulisesbocchio/jasypt-spring-boot

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

github.com

http://www.jasypt.org/

 

Jasypt: Java simplified encryption - Jasypt: Java simplified encryption - Main

Jasypt 1.9.3 RELEASED! (May 25th, 2019) [DOWNLOAD and ChangeLogs] [WHAT'S NEW IN JASYPT 1.9] Java Simplified Encryption Jasypt is a java library which allows the developer to add basic encryption capabilities to his/her projects with minimum effort, and wi

www.jasypt.org

라이브러리 추가

https://mvnrepository.com/artifact/org.jasypt/jasypt

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

나는 Gradle을 이용하기 때문에 build.gradle에 의존성을 추가해준다. Maven을 쓸 땐 pom.xml에 추가하면 됨.

나는 작업 당시 가장 최신버전을 사용했지만 달리 원하는 버전이 있다면 사용해도 무관

dependencies {
    // https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter
    compile group: 'com.github.ulisesbocchio', name: 'jasypt-spring-boot-starter', version: '3.0.3'
    // https://mvnrepository.com/artifact/org.jasypt/jasypt
    compile group: 'org.jasypt', name: 'jasypt', version: '1.9.3'
}

[프로젝트명]Application.java

package com.blah.test;

import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
//아래 어노테이션이 중요
@EnableEncryptableProperties
public class TestApplication {

	public static void main(String[] args) {
		SpringApplication.run(TestApplication.class, args);
	}

}

암호화

방법1) 프로그램으로 암호화

@SpringBootTest
class EncodingApplicationTests {

	@Test
	void contextLoads() {
		
		StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();

		encryptor.setPassword("사용할password");          //암호화, 복호화할 때 사용할 패스워드
		encryptor.setAlgorithm("PBEWithMD5AndDES");
		encryptor.setStringOutputType("base64");

		String url = "jdbc:mysql://localhost:3306/test?serverTimezone=UTC&characterEncoding=UTF-8";
		String username = "test";
		String password = "test123"; //패스워드를 test123으로 지정
		String urlResult = encryptor.encrypt(url);
		String usernameResult = encryptor.encrypt(username);
		String passwordReesult = encryptor.encrypt(password);

		System.out.println("url plain : " + encryptor.decrypt(urlResult));          //복호화
		System.out.println("url encoding : " + urlResult);                          //암호화 (설정파일에 사용)

		System.out.println("username plain : " + encryptor.decrypt(usernameResult));//복호화
		System.out.println("username encoding : " + usernameResult);                //암호화 (설정파일에 사용)

		System.out.println("password plain : " + encryptor.decrypt(passwordReesult));//복호화
		System.out.println("password encoding : " + passwordReesult);                //암호화 (설정파일에 사용)

	}
}

결과)

url plain : jdbc:mysql://localhost:3306/find_animal?serverTimezone=UTC&characterEncoding=UTF-8
url encoding : BB2oEp6njcRRwuQYZH8vFi2Iu35yBGSV5lDJrr/mZdcSLfy+j+H7G+5yshnuP4ZmrrB+/KIJ7ArLw6ScZMbzd5YK6nWVtM4GqSCneiJ+DdvxP4iRhVREYcI3cqBVaUFf
username plain : test
username encoding : JPgjry4UObmNMw+kiOuVdA==
password plain : test123
password encoding : 23eeT+r5SiJfrS9FzN7g6Q==

 

방법2) 사이트에서 암호화

아래 사이트에서 Two Way Encryption(With Secret Text) 로 암호화하기

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

 

Best Programming Courses and Tutorials | DevGlan

Choose your programming language interest and we will suggest you the best courses, tutorials and blog articles from around the web that is recommended by the Programming community.

www.devglan.com

PropertiesConfig.java

@Configuration
public class PropertiesConfig {

	/**
	 * jasypt 비밀번호
	 */
	@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"); //해시 반복 횟수
		encryptor.setConfig(config);
		return encryptor;

	}

}

application.yaml

나는 yaml을 사용해서 application.yaml 에 작성했지만, application.properties 를 사용하시면 거기에 입력하시면 됨.

spring:
  datasource:
    url: ENC(BB2oEp6njcRRwuQYZH8vFi2Iu35yBGSV5lDJrr/mZdcSLfy+j+H7G+5yshnuP4ZmrrB+/KIJ7ArLw6ScZMbzd5YK6nWVtM4GqSCneiJ+DdvxP4iRhVREYcI3cqBVaUFf)
    username: ENC(JPgjry4UObmNMw+kiOuVdA==)
    password: ENC(23eeT+r5SiJfrS9FzN7g6Q==)
    driver-class-name: com.mysql.cj.jdbc.Driver

 

 

 

Boot Run

Environment variables에 jasypt.encrytor.password=사용한 패스워드 키 를 추가하고 실행한다.

yaml파일에 명시해주지 않았기 때문에 위의 값을 추가해줘야 @Value("${jasypt.encryptor.password}") 를 사용할 수 있다.

 

우분투에서 톰캣을 사용하여 서버 올릴 때에는 아래 포스팅 참고

2021.06.23 - [리눅스] - 리눅스 서버 구동 시 환경변수 넘기기 [Linux, Ubuntu, Tomcat]