ふたりで

jasypt 를 이용한 properties DB정보 암호화 본문

Spring

jasypt 를 이용한 properties DB정보 암호화

graykang 2020. 7. 22. 15:41
728x90
반응형
SMALL

# 적용 환경 

- springboot2.3

- mariadb

- mybatis2

- springsecurity

- maven

 

# 처음 jasypt dependency를 pom.xml에 추가만 했는대도 로그인 페이지에서  로그인 시도 시 HikariPool 데이터 소스

관련 에러가 발생하였다. 결론부터 말하자면 mybatis 버전 및 디펜던시 설정을 변경하니 잘 적용되었다.

정확한 원인은 아직도 잘은 모르겠으나 이틀 동안 삽질 끝에 해결을 하여 해당 내용을 아래 정리해본다.

 

#참고: 필자의 경우 tomcat8.5 버전에 springboot2.3 프로젝트를 war파일로 배포를 하며 view화면 쪽은 jsp를 사용한다.

 

# 먼저 pom.xml에 jasypt dependency를 추가해 준다.

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

 

1. mybatis dependency를 아래와 같이 변경하였다.(주석 처리한 부분이 기존에 설정했던 부분이다.)

<!--         <dependency> -->
<!--             <groupId>org.mybatis</groupId> -->
<!--             <artifactId>mybatis</artifactId> -->
<!--             <version>3.3.0</version> -->
<!--         </dependency> -->
<!--         <dependency> -->
<!--             <groupId>org.mybatis</groupId> -->
<!--             <artifactId>mybatis-spring</artifactId> -->
<!--             <version>1.2.3</version> -->
<!--         </dependency> -->
	<dependency>
		<groupId>org.mybatis.spring.boot</groupId>
		<artifactId>mybatis-spring-boot-starter</artifactId>
		<version>2.0.1</version>
	</dependency>
728x90
반응형
SMALL

2. mysql dependency를 아래와 같이 변경하였다.(주석 처리한 부분이 기존에 설정했던 부분이다.)

<!--         <dependency> -->
<!--             <groupId>org.mariadb.jdbc</groupId> -->
<!--             <artifactId>mariadb-java-client</artifactId> -->
<!--             <version>1.3.2</version> -->
<!--         </dependency> -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

3. 최종 DB 관련 dependency이다.

<!-- DB -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
</dependency>	
<!-- MyBatis -->
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>2.0.1</version>
</dependency>
<!-- MyBatis log4jdbc -->
<dependency>
  <groupId>org.bgee.log4jdbc-log4j2</groupId>
  <artifactId>log4jdbc-log4j2-jdbc4.1</artifactId>
  <version>1.16</version>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
  <optional>true</optional>
</dependency>
<!-- DB -->

4. application.properties 설정.

properties는 기존 DB 연결 설정을 암호화한 문자열로 대체하고 jasypt설정 값을 추가하였다.

##jasypt
jasypt.encryptor.bean=jasyptStringEncryptor
jasypt.encryptor.property.prefix=ENC(
jasypt.encryptor.property.suffix=)
##mariaDB1
spring.db1.datasource.driver-class-name=net.sf.log4jdbc.sql.jdbcapi.DriverSpy
spring.db1.datasource.jdbc-url=ENC(agiKQ1hOFCyEM38QJU7JRnNlf3q4JNBMHvLRE+JDn1mMEEmAO/s92N+sIe7GgD/GZduXCI/lINLizqwertEIo1b1VHYu/OlEbX21A==)
spring.db1.datasource.username=ENC(RuPmP4U3ucZqZsPje5tGKCwdrtgh)
spring.db1.datasource.password=ENC(G3Vjutez31IWz0vm3bvasMSEHAgwu)
#spring.db1.datasource.jdbc-url=jdbc:log4jdbc:mysql://localhost:3306/mydatabase?serverTimezone=UTC
#spring.db1.datasource.username=abcd
#spring.db1.datasource.password=abcd1234

# 암호화 문자열을 생성하려면 아래 소스를 참고하여 만든다.

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("kkkdddbbb"); 
		String url = jdbc:log4jdbc:mysql://localhost:3306/mydatabase?serverTimezone=UTC"; 
		String username = "abcd"; 
		String password = "abcd1234"; 
		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)); 
	} 
}

 

5. jasypt Config 설정.(아래 소스를 참고하여 jasyptConfig라는 class를 생성해준다.

- jasyptConfig.java

package com.test.jasypttest.config;

import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;

@Configuration
public class jasyptConfig {
	private static final String ENCRYPT_KEY = "kkkdddbbb";

	@Bean("jasyptStringEncryptor")
	public StringEncryptor stringEncryptor(Environment env) {
		SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        
        /*외부에서 ENCRYPT_KEY 를 대체할 경우 아래 주석 부분을 사용한다.
        * 참고로 외부 에서 대체 하는 방식으로 적용 하려면 Application.java 클래스 파일에 
        * @SpringBootApplication 어노테이션이 있는부분에 @EnableEncryptableProperties 
        * 어노테이션을 추가로 삽입 하면 된다. 
        * 그리고 해당 키값을 tomcat의 arguments 에 설정해야 한다.(war배포일 경우...)
        * arguments ex) -Djasypt.encryptor.password = XXXXXXXXXXXXXXXXXXXX 
        */
		//config.setPassword(env.getProperty("jasypt.encryptor.password"));
        
		config.setPassword(ENCRYPT_KEY);
		config.setAlgorithm("PBEWithMD5AndDES");
		config.setKeyObtentionIterations("1000");
		config.setPoolSize("1");
		config.setProviderName("SunJCE");
		config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
		config.setStringOutputType("base64");
		
		PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
		encryptor.setConfig(config);
		
		return encryptor;
	}
}

6. 외장 톰켓 또는 내장 톰켓의 VM Arguments 로 ENCRYPT_KEY 를 사용 할 경우.

 

  6-1. springboot 내장 Embedded tomcat을 사용 할 경우 아래 그림 참조

해당 화면에서 원하는 프로젝트에 마우스 오른쪽 버튼 클릭> 메뉴의 open config를 선택하면 아래 그림과 같은 창이 뜬다.

 

해당 화면에서 VM arguments 항목에 "-Djasypt.encryptor.password=" 에 키값을 입력 하면 끝.

 

 

  6-2. 이클립스 외장 tomcat을 사용하는 경우도 비슷 하다 서버로 등록한 tomcat에 설정 파일을 열어 VM arguments

          항목에 "-Djasypt.encryptor.password=XXXXXXXXXXXXXXXXXXXXXXX" 에 키값을 입력 하면 끝.

 

  6-3. linux(centos) 에 구동 중인 tomcat의 경우.

 

         - apt-get또는 yum을 통해 Tomcat을 설치한 경우에는 /etc/tomcat8/tomcat8.conf 파일이 있어야 하며,

           해당 파일에 해당파일의 끝에 아래 와 같이 추가 한다. 

JAVA_OPTS="$JAVA_OPTS -Djasypt.encryptor.password=XXXXXXXXXXXXXXXXXXXXXXXXXX"

 

 

           - 다운로드및 압축 해제를 통해 설치된 Tomcat의 경우 아래와 같이 등록.

             /]# <tomcat>/bin/catalina.sh 파일을 vi로 열어 마지막줄 또는 JAVA_OPTS 라고 등록된 부분을 찾아

             그 다음줄(개행후)에  아래와 같이 등록 하고 저장 합니다.

JAVA_OPTS="$JAVA_OPTS -Djasypt.encryptor.password=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
728x90
반응형
LIST
Comments