본문 바로가기

표준프레임워크_eGovFrame/공통컴포넌트_Common Components

표준프레임워크 3.8 공통컴포넌트 globals.properties db 암호화(Crypto Service)

위와 같은 사양으로 tested

 

표준프레임워크 공통컴포넌트를 이미 설치했다면, 프로젝트 내 /src/main/resources/egovProps/globals.properties 쪽에 

파일이 있다는 걸 알거라 생각하고 넘어가겠습니다.

공통컴포넌트는 globas.properties에 다양한 설정 값을 가지고 있습니다.

그 중 DB에 대한 정보가 아래와 같이 들어갑니다.

#Globals.mysql.DriverClassName=net.sf.log4jdbc.DriverSpy
#Globals.mysql.Url=jdbc:log4jdbc:mysql://localhost:3306/test38
#Globals.mysql.UserName = 사용자계정
#Globals.mysql.Password = 비밀번호

계정정보 및 접속 정보는 보안상 변경이 필요하기 때문에, 표준프레임워크 암호화 간소화 설정을 사용해서 암호화 해보겠습니다.

먼저 src/test/java쪽과 src/test/resources 쪽에서 암호값을 만든 뒤 main 쪽에서 적용한 뒤 was에 프로젝트를 올려 db를 구동시켜보겠습니다.

 

첫 번째로 프로젝트 내 메이븐 사용 중이라면 pom.xml에 아래와 같은 라이브러리가 선언되었고, 빌드가 되었는지 확인해보시면 됩니다.

위치 

가장 하단 pom.xml 파일 클릭

        <dependency>
            <groupId>egovframework.rte</groupId>
            <artifactId>egovframework.rte.fdl.crypto</artifactId>
            <version>${egovframework.rte.version}</version>
        </dependency>

version 부분은 위에 공통으로 선언되어있고 별도로 기입하셔도 되지만, dependency를 위해 버전별 호환 여부를 점검하시기 바랍니다.

 

src/test/java란 곳에

egovframwork.com.cmm.crypto.EgovEnvCryptoAlgorithmCreateTest.java를 만들어 아래와 같은 코드를 넣어주시기 바랍니다.

노란 화살표 참고

package egovframwork.com.cmm.crypto;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import egovframework.rte.fdl.cryptography.EgovPasswordEncoder;
 
public class EgovEnvCryptoAlgorithmCreateTest {
 
	private static final Logger LOGGER = LoggerFactory.getLogger(EgovEnvCryptoAlgorithmCreateTest.class);
 
	//계정암호화키 키
	public String algorithmKey = "egovframe";
 
	//계정암호화 알고리즘(MD5, SHA-1, SHA-256)
	public String algorithm = "SHA-256";
 
	//계정암호화키 블럭사이즈
	public int algorithmBlockSize = 1024;
 
	public static void main(String[] args) {
		EgovEnvCryptoAlgorithmCreateTest cryptoTest = new EgovEnvCryptoAlgorithmCreateTest();
 
		EgovPasswordEncoder egovPasswordEncoder = new EgovPasswordEncoder();
		egovPasswordEncoder.setAlgorithm(cryptoTest.algorithm);
 
		LOGGER.info("------------------------------------------------------");
		LOGGER.info("알고리즘(algorithm) : "+cryptoTest.algorithm);
		LOGGER.info("알고리즘 키(algorithmKey) : "+cryptoTest.algorithmKey);
		LOGGER.info("알고리즘 키 Hash(algorithmKeyHash) : "+egovPasswordEncoder.encryptPassword(cryptoTest.algorithmKey));
		LOGGER.info("알고리즘 블럭사이즈(algorithmBlockSize)  :"+cryptoTest.algorithmBlockSize);
 
	}
}

Run as> Java Applications 로 프로젝트를 돌리면 아래와 같은 값이 Console에 찍힐 겁니다.

[log4j]2019-09-18 13:18:24,658  INFO [egovframwork.com.cmm.crypto.EgovEnvCryptoAlgorithmCreateTest] ------------------------------------------------------
[log4j]2019-09-18 13:18:24,661  INFO [egovframwork.com.cmm.crypto.EgovEnvCryptoAlgorithmCreateTest] 알고리즘(algorithm) : SHA-256
[log4j]2019-09-18 13:18:24,661  INFO [egovframwork.com.cmm.crypto.EgovEnvCryptoAlgorithmCreateTest] 알고리즘 키(algorithmKey) : egovframe
[log4j]2019-09-18 13:18:24,689  INFO [egovframwork.com.cmm.crypto.EgovEnvCryptoAlgorithmCreateTest] 알고리즘 키 Hash(algorithmKeyHash) : gdyYs/IZqY86VcWhT8emCYfqY1ahw2vtLG+/FzNqtrQ=
[log4j]2019-09-18 13:18:24,689  INFO [egovframwork.com.cmm.crypto.EgovEnvCryptoAlgorithmCreateTest] 알고리즘 블럭사이즈(algorithmBlockSize)  :1024

다음은 src/test/resources쪽에  아래 두개의 파일을 만들어 줍니다.

꼭 두개다 만드셔야됩니다. 소스를 보시면 아시게 됩니다.

//EgovEnvCryptoUserTest.java
package egovframwork.com.cmm.crypto;

//데이터베이스 연결 항목(Url, UserName, Password) 인코딩 값 생성 JAVA
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import egovframework.rte.fdl.cryptography.EgovEnvCryptoService;
import egovframework.rte.fdl.cryptography.impl.EgovEnvCryptoServiceImpl;

public class EgovEnvCryptoUserTest {

	private static final Logger LOGGER = LoggerFactory.getLogger(EgovEnvCryptoUserTest.class);

	public static void main(String[] args) {

		String[] arrCryptoString = { 
		"아이디",         //데이터베이스 접속 계정 설정
		"비밀번호",   //데이터베이스 접속 패드워드 설정
		"데이터베이스접속주소",            //데이터베이스 접속 주소 설정
		"net.sf.log4jdbc.DriverSpy"  //데이터베이스 드라이버
           };


		LOGGER.info("------------------------------------------------------");		
		ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath:/egovframework/spring/com/crypto/context-crypto-test.xml"});
		EgovEnvCryptoService cryptoService = context.getBean(EgovEnvCryptoServiceImpl.class);
		LOGGER.info("------------------------------------------------------");

		String label = "";
		try {
			for(int i=0; i < arrCryptoString.length; i++) {		
				if(i==0)label = "사용자 아이디";
				if(i==1)label = "사용자 비밀번호";
				if(i==2)label = "접속 주소";
				if(i==3)label = "데이터 베이스 드라이버";
				LOGGER.info(label+" 원본(orignal):" + arrCryptoString[i]);
				LOGGER.info(label+" 인코딩(encrypted):" + cryptoService.encrypt(arrCryptoString[i]));
				LOGGER.info("------------------------------------------------------");
			}
		} catch (IllegalArgumentException e) {
			LOGGER.error("["+e.getClass()+"] IllegalArgumentException : " + e.getMessage());
		} catch (Exception e) {
			LOGGER.error("["+e.getClass()+"] Exception : " + e.getMessage());
		}

	}

}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:egov-crypto="http://www.egovframe.go.kr/schema/egov-crypto"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.egovframe.go.kr/schema/egov-crypto http://www.egovframe.go.kr/schema/egov-crypto/egov-crypto-3.8.xsd">
 
	<bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="useCodeAsDefaultMessage">
			<value>true</value>
		</property>
	</bean>
 
    <egov-crypto:config id="egovCryptoConfig" 
    	initial="false"
    	crypto="true"
    	algorithm="SHA-256"
    	algorithmKey="egovframe"
    	algorithmKeyHash="gdyYs/IZqY86VcWhT8emCYfqY1ahw2vtLG+/FzNqtrQ="
		cryptoBlockSize="1024"
	/>
</beans>

그리고 역시 EgovEnvCryptoUserTest.java 파일을 Run as > Java Applications..로 돌리시면 아래 콘솔 처럼 암호값을 얻으실 겁니다.

[log4j]2019-09-18 13:32:33,663  INFO [egovframwork.com.cmm.crypto.EgovEnvCryptoUserTest] ------------------------------------------------------
[log4j]2019-09-18 13:32:33,703  INFO [org.springframework.context.support.ClassPathXmlApplicationContext] Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@3ce1e309: startup date [Wed Sep 18 13:32:33 KST 2019]; root of context hierarchy
[log4j]2019-09-18 13:32:33,744  INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] Loading XML bean definitions from class path resource [egovframework/spring/com/crypto/context-crypto-test.xml]
[log4j]2019-09-18 13:32:33,888 DEBUG [egovframework.rte.fdl.cryptography.config.EgovCryptoConfigBeanDefinitionParser] EgovCryptoConfigBeanDefinitionParser doParse Execute !!!
[log4j]2019-09-18 13:32:33,888 DEBUG [egovframework.rte.fdl.cryptography.config.EgovCryptoConfigBeanDefinitionParser] egov.crypto.algorithmKey : xml property setting!!
[log4j]2019-09-18 13:32:33,888 DEBUG [egovframework.rte.fdl.cryptography.config.EgovCryptoConfigBeanDefinitionParser] egov.crypto.algorithmKeyHash : xml property setting!!
[log4j]2019-09-18 13:32:33,888 DEBUG [egovframework.rte.fdl.cryptography.config.EgovCryptoConfigBeanDefinitionParser] EgovCryptoConfigBeanDefinitionParser httpd load start...
[log4j]2019-09-18 13:32:33,890  INFO [org.springframework.beans.factory.xml.XmlBeanDefinitionReader] Loading XML bean definitions from InputStream resource [resource loaded through InputStream]
[log4j]2019-09-18 13:32:33,905 DEBUG [egovframework.rte.fdl.cryptography.config.EgovCryptoConfigBeanDefinitionParser] EgovCryptoConfigBeanDefinitionParser httpd load end...
[log4j]2019-09-18 13:32:33,980 DEBUG [egovframework.rte.fdl.cryptography.impl.EgovARIACryptoServiceImpl] passwordEncoder's algorithm : SHA-256
[log4j]2019-09-18 13:32:33,992 DEBUG [egovframework.rte.fdl.property.impl.EgovPropertyServiceImpl] debug.properties.filename
[log4j]2019-09-18 13:32:34,006  INFO [egovframwork.com.cmm.crypto.EgovEnvCryptoUserTest] ------------------------------------------------------
[log4j]2019-09-18 13:32:34,006  INFO [egovframwork.com.cmm.crypto.EgovEnvCryptoUserTest] 사용자 아이디 원본(orignal):root
[log4j]2019-09-18 13:32:34,037  INFO [egovframwork.com.cmm.crypto.EgovEnvCryptoUserTest] 사용자 아이디 인코딩(encrypted):qsJPlU9QNewFIlyt5CSK9Q%3D%3D
[log4j]2019-09-18 13:32:34,038  INFO [egovframwork.com.cmm.crypto.EgovEnvCryptoUserTest] ------------------------------------------------------
[log4j]2019-09-18 13:32:34,038  INFO [egovframwork.com.cmm.crypto.EgovEnvCryptoUserTest] 사용자 비밀번호 원본(orignal):frame001
[log4j]2019-09-18 13:32:34,038  INFO [egovframwork.com.cmm.crypto.EgovEnvCryptoUserTest] 사용자 비밀번호 인코딩(encrypted):Ltn3IIvmO2OI3hJ7V4aT%2Bg%3D%3D
[log4j]2019-09-18 13:32:34,038  INFO [egovframwork.com.cmm.crypto.EgovEnvCryptoUserTest] ------------------------------------------------------
[log4j]2019-09-18 13:32:34,038  INFO [egovframwork.com.cmm.crypto.EgovEnvCryptoUserTest] 접속 주소 원본(orignal):jdbc:log4jdbc:mysql://localhost:3306/roletest38?serverTimezone=UTC
[log4j]2019-09-18 13:32:34,038  INFO [egovframwork.com.cmm.crypto.EgovEnvCryptoUserTest] 접속 주소 인코딩(encrypted):IPnSE1%2BSpbvetos96I7vdandlsI0robasuaiQomjB%2BCSxEZ1gRStroVxVuHV9MlF9ULBojnkcLQJTBaUzTc5mn2o55GX7QuUEkMYE219%2Bbk%3D
[log4j]2019-09-18 13:32:34,038  INFO [egovframwork.com.cmm.crypto.EgovEnvCryptoUserTest] ------------------------------------------------------
[log4j]2019-09-18 13:32:34,038  INFO [egovframwork.com.cmm.crypto.EgovEnvCryptoUserTest] 데이터 베이스 드라이버 원본(orignal):net.sf.log4jdbc.DriverSpy
[log4j]2019-09-18 13:32:34,038  INFO [egovframwork.com.cmm.crypto.EgovEnvCryptoUserTest] 데이터 베이스 드라이버 인코딩(encrypted):RC2Xpum1xR5Djc9LD1tsx%2B6RmBK%2Fli2vgmOkLbTft2k%3D
[log4j]2019-09-18 13:32:34,039  INFO [egovframwork.com.cmm.crypto.EgovEnvCryptoUserTest] ------------------------------------------------------

이제 콘솔에서 얻은 encrypted 암호 값을 아래 해당 노란 화살표 파일에 들어가

아래와 같이 넣어 줍니다. (예시는 mysql)

Globals.mysql.DriverClassName=콘솔값
Globals.mysql.Url=콘솔값LBojnkcLQJTBaUzTc5mn2o55GX7QuUEkMYE219%2Bbk%3D
Globals.mysql.UserName = 콘솔값
Globals.mysql.Password = 콘솔값

다음은 아래 노란 화살표의 파일을 엽니다. context-crypto.xml

context-crypto.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:egov-crypto="http://www.egovframe.go.kr/schema/egov-crypto"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.egovframe.go.kr/schema/egov-crypto http://www.egovframe.go.kr/schema/egov-crypto/egov-crypto-3.8.xsd">
 
	<!-- 
	initial : globals.properties 연계 Url, UserName, Password 값 로드 여부(설정값 : true, false)
	crypto : 계정 암호화 여부(설정값 : true, false)
	algorithm : 계정 암호화 알고리즘
	algorithmKey : 계정 암호화키 키
	cryptoBlockSize : 계정 암호화키 블록사이즈
	-->
    <egov-crypto:config id="egovCryptoConfig" 
    	initial="true"
    	crypto="true"
    	algorithm="SHA-256"
    	algorithmKey="egovframe"
    	algorithmKeyHash="gdyYs/IZqY86VcWhT8emCYfqY1ahw2vtLG+/FzNqtrQ="
		cryptoBlockSize="1024"
	/>
 
</beans>

위와 같이 넣어준 후 datasource에서 decrypt를 해줍니다. context-datasource.xml로 갑니다.

context.datasource.xml

코드를 아래와 같이 변경해줍니다.

	<!-- MySQL -->
    <!-- before -->
    <beans profile="mysql">  
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="${Globals.mysql.DriverClassName}"/>
		<property name="url" value="${Globals.mysql.Url}" />
		<property name="username" value="${Globals.mysql.UserName}"/>
		<property name="password" value="${Globals.mysql.Password}"/>
	</bean>
	</beans> -->
    
    <-- after -->
	<beans profile="mysql">  
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="#{egovEnvCryptoService.decrypt('${Globals.mysql.DriverClassName}')}"/>
		<property name="url" value="#{egovEnvCryptoService.getUrl()}" />
		<property name="username" value="#{egovEnvCryptoService.getUsername()}" />
		<property name="password" value="#{egovEnvCryptoService.getPassword()}" />
	</bean>
	</beans>

 

자 이제 프로젝트를 기동하시면 WAS와 DB가 잘 연결되었음을 알 수 있습니다.

 

그 외 에러 발생 시 댓글을 달아주시면 도와드리겠습니다~~~~~