본문 바로가기
개발노트

[암호화]DB접속정보 암호화하기1(crypto)

by SoonNote 2024. 2. 23.
반응형

 

유지보수 중인 프로젝트들의 DB접속정보 암호화 요청으로 인하여 전자정부 3.8이상의 버전은 crypto 간소화서비스를, 3.7이하 버전에는 AES방법, ASP는 base64방식을 사용하여 암호화를 하였다.

 

첫번째로 전자정부 프레임워크에서 제공하는 crypto 간소화 서비스를 이용하여 DB 접속정보를 암호화한다. 3.8이상의 버전에서 사용하였다.

 

두번째 AES방식확인하기

 

[암호화]DB접속정보 암호화하기2(AES)

유지보수 중인 프로젝트들의 DB접속정보 암호화 요청으로 인하여 전자정부 3.8이상의 버전은 crypto 간소화서비스를, 3.7이하 버전에는 AES방법, ASP는 base64방식을 사용하여 암호화를 하였다. 첫번째

soondevnote.tistory.com

 

 

 

egov버전 : 3.10

java : 1.8

 

1. pom.xml에 해당하는 버전의 crypto를 추가되어있는지 확인

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

 

 

2, class파일을 생성하여 hashKey를 발급

public class EgovEnvCryptoAlgorithmCreate {
	
	//계정암호회키
	public String algorithmKey = "test";
	
	//계정암호화 알고리즘(MD5, SHA-1, SHA-256)
	public String algorithm = "SHA-256";
	
	//계정암호화키 블럭사이즈
	public int algorithmBlockSize = 1024;
	
	public static void main(String[] args){
		EgovEnvCryptoAlgorithmCreate crypto = new EgovEnvCryptoAlgorithmCreate();
		
		EgovPasswordEncoder egovPasswordEncoder = new EgovPasswordEncoder();
		egovPasswordEncoder.setAlgorithm(crypto.algorithm);
		
		System.out.println("-------------------------------------------------------");
		System.out.println("알고리즘(algorithm) : "+crypto.algorithm);
		System.out.println("알고리즘 키(algorithmKey) : "+crypto.algorithmKey);
		System.out.println("알고리즘 키 Hash(algorithmKeyHash) : "+ egovPasswordEncoder.encryptPassword(crypto.algorithmKey));
		System.out.println("알고리즘 블럭사이즈(algorithmBlockSize) : "+crypto.algorithmBlockSize);
		
	}

}

run as -> java application을 이용하여 실행 

3. context-crypto.xml에 crypto 간소화 서비스 설정을 등록

<?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://maven.egovframe.go.kr/schema/egov-crypto" 
    xmlns:p="http://www.springframework.org/schema/p"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://maven.egovframe.go.kr/schema/egov-crypto http://maven.egovframe.go.kr/schema/egov-crypto/egov-crypto-4.0.0.xsd"> 
     
    <bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="useCodeAsDefaultMessage">
			<value>true</value>
		</property>
		<property name="basenames">
			<list>
				<value>classpath:/egovframework/egovProps/globals</value>
			</list>
		</property>
	</bean>
	
	
	
	<egov-crypto:config id="egovCryptoConfig" 
    	initial="true"
    	crypto="true"
    	algorithm="SHA-256"
    	algorithmKey="test"
    	algorithmKeyHash="n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg="
	cryptoBlockSize="1024"
	/>

</beans>

2번 에서 test키를 이용하여 받은 hash값과 messageSource bean을 등록해준다.

 

 

4.DB정보 암호화

public static void main(String[] args) {
 
		String[] arrCryptoString = { 
		"username",   //데이터베이스 접속 계정 설정
		"password",   //데이터베이스 접속 패드워드 설정
		"jdbc:mysql://127.0.0.1:3306/test?allowMultiQueries=true&zeroDateTimeBehavior=convertToNull", //데이터베이스 접속 주소 설정
		"com.mysql.jdbc.Driver"  //데이터베이스 드라이버
		};
 
		System.out.println("------------------------------------------------------");		
		ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath:/egovframework/spring/com/context-crypto.xml"});
		EgovEnvCryptoService cryptoService = context.getBean(EgovEnvCryptoServiceImpl.class);
		System.out.println("------------------------------------------------------");
 
		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 = "데이터 베이스 드라이버";
				System.out.println(i+". "+label+" 원본(orignal):" + arrCryptoString[i]);
				System.out.println(i+". "+label+" 인코딩(encrypted):" + cryptoService.encrypt(arrCryptoString[i]));
				System.out.println("------------------------------------------------------");
			}
		} catch (IllegalArgumentException e) {
			System.out.println("["+e.getClass()+"] IllegalArgumentException : " + e.getMessage());
		} catch (Exception e) {
			System.out.println("["+e.getClass()+"] Exception : " + e.getMessage());
		}
 
	}

run as -> java application을 이용하여 실행 

 

 

 

5. 암호화된 DB접속정보를 globals.properties에 입력

Globals.mysql.DriverClassName=qvIJLSSd6ViMuJW%2BigtzHwQQNB2HMSXtZCSYw8u8mmw%3D
Globals.mysql.Url=ZXj4xEsRwKQB%2BpH%2BKVCtVXQrOWhl6V4Iy%2FKAboeCVFbNUj3rwvfUAVcf9XZdyZ74%2BB53Kk5DYJw6dALup8Z9STC6ofvJHlul8FvZ5wnWkrW1ON2n%2Bxpl3w4UnFh0XUoI
Globals.mysql.UserName =YLeHzOV9Xmh0JRYKARonlA%3D%3D
Globals.mysql.Password =QdfmcOcB2vVn27TmfJUqhg%3D%3D

 

 

 

6. context-crypto.xml bean등록 제거

messageSource bean을 주석 또는 제거한다.

<?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://maven.egovframe.go.kr/schema/egov-crypto" 
    xmlns:p="http://www.springframework.org/schema/p"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://maven.egovframe.go.kr/schema/egov-crypto http://maven.egovframe.go.kr/schema/egov-crypto/egov-crypto-4.0.0.xsd"> 
     
    <!-- <bean name="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="useCodeAsDefaultMessage">
			<value>true</value>
		</property>
		<property name="basenames">
			<list>
				<value>classpath:/egovframework/egovProps/globals</value>
			</list>
		</property>
	</bean> -->
	
	<bean id="egovPasswordEncoder" class="egovframework.rte.fdl.cryptography.EgovPasswordEncoder">
		<property name="algorithm" value="SHA-256" />
		<property name="hashedPassword" value="gdyYs/IZqY86VcWhT8emCYfqY1ahw2vtLG+/FzNqtrQ=" />
	</bean>
	
	<bean id="egovARIACryptoService" class="egovframework.rte.fdl.cryptography.impl.EgovARIACryptoServiceImpl">
		<property name="passwordEncoder" ref="egovPasswordEncoder" />
		<property name="blockSize" value="1024" />
	</bean>
	
	<egov-crypto:config id="egovCryptoConfig" 
    	initial="true"
    	crypto="true"
    	algorithm="SHA-256"
    	algorithmKey="test"
    	algorithmKeyHash="n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg="
	cryptoBlockSize="1024"
	/>

</beans>

 

 

7. context-datasource.xml 수정

<bean id="dataSource-mysql" 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>

위 코드처럼 수정 후 실행하면 암화된 방법으로 DB접속정보 보안을 강화 할 수 있다.

 

 

 

AES, BASE64 이어서 작성예정

 

AES암호화방식 확인하기

 

[암호화]DB접속정보 암호화하기2(AES)

유지보수 중인 프로젝트들의 DB접속정보 암호화 요청으로 인하여 전자정부 3.8이상의 버전은 crypto 간소화서비스를, 3.7이하 버전에는 AES방법, ASP는 base64방식을 사용하여 암호화를 하였다. 첫번째

soondevnote.tistory.com

 

반응형