웹이야기

globals.properties 의 정보에 대한 암호문 생성 본문

전자정부표준프레임워크

globals.properties 의 정보에 대한 암호문 생성

yeon.Biju 2020. 3. 11. 16:21

globals.properties 에 있는 중요정보에 대해서 암호문을 생성할 수 있는 방법을 생각해보자.

전자정부 표준프레임워크 3.8 부터 지원하는 기능인 것 같다. 

전자정부 표준프레임워크 3.9 를 다운받아보니 기본설정으로 암호화하는 것으로 되어 있고, 3.8은 그렇지 않았다. 

 

 

위키문서에 그 내용이 기술되어 있는데, 이 블로그 글은 그 내용을 길게 늘여뜨린 것에 불과하다.

 

https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte2:fdl:crypto_simplify_v3_8

 

egovframework:rte2:fdl:crypto_simplify_v3_8 [eGovFrame]

표준프레임워크 3.8 부터 ARIA 블록암호 알고리즘 기반 암/복호화 설정을 간소화 할 수 있는 방법을 제공한다. 내부적으로 필요한 설정을 가지고 있고, XML Schema를 통해 필요한 설정만을 추가할 수 있도록 제공한다. 또한 globals.properties 설정 파일의 중요 정보 Url, UserName, Password 항목을 암/복호화 처리 할 수 있도록 제공한다. 그외에 정보는 properties 파일에 암호화 데이터 설정후 #{egovEnv

www.egovframe.go.kr

 

 

설정정보중에 오라클 접속정보 중에 비밀번호를 암호화한다고 해보자

 

오라클 연결정보중에 아이디 // 비밀번호는 다음과 같다.

아이디 : test

비밀번호 : test1234

 

뭔지 잘은 모르지만

algorithmKey : egovframe

algorithm : SHA-256

algorithmBlockSize : 1024

라고 정의를 하고 시작해보자.

 

algorithmKey 는 다른 걸 입력해도 무방하지만 여기서는 편의상 egovframe 이라고 한다. 

그러면 이 글에서는 오라클 비밀번호인 test1234 에 대한 암호문을 만드는 것을 목표로 한다.  그것을 적용하는 것은 다음 글에서 기술한다.

 

암호문을 만들기 위해서는 먼저 알고리즘 키 Hash(algorithmKeyHash) 값을 구해야 하는 것 같다.

아래 1번에서 4번까지의 절차에 해당한다.

 

1. EgovEnvCryptoAlgorithmCreateTest.java 파일 생성

 

   - 현재 테스트 하기 위해 셋팅된 이클립스는 전자정부 표준프레임워크 3.9 를 기반으로 한다.

      전자정부 표준프레임워크 3.9 가 셋팅이 되어 있다는 얘기다.

 

      위 URL에 있는 코드를 그대로 복사해서 java 파일을 하나 생성한다.

      이름을 EgovEnvCryptoAlgorithmCreateTest.java 라고 하였다.

 

* java 파일의 생성 위치를 ...\src\main\java 바로 밑에 두었다. 그렇지 않은 경우 패키징 관련 오류가 발생한다.

   - 소스의 내용은 아래와 같다. 소스의 카피는 위키 URL에서 하는 것이 좋다.

 

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 = "(사용자정의 값)";
 
//계정암호화 알고리즘(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);
 
}
}

 

   - 위키 URL에서 아래영역에 해당한다.

 

2. 1번에서 생성한 EgovEnvCryptoAlgorithmCreateTest.java 소스를 수정.

   1) algorithmKey 수정

     public String algorithmKey = "(사용자정의 값)";

      부분을 아래와 같이 수정한다.

     public String algorithmKey = "egovframe"; 

 

      시작 전에 정의한 algorithmKey 의 값이다. 임의의 값을 넣을 수 있다.

 

   2) algorithm 확인, SHA-256으로 되어 있는 것 확인

     //계정암호화 알고리즘(MD5, SHA-1, SHA-256)
     public String algorithm = "SHA-256";
 
   3) algorithmBlockSize 확인, 1024로 되어 있는 것 확인

     //계정암호화키 블럭사이즈
     public int algorithmBlockSize = 1024;

 

3. EgovEnvCryptoAlgorithmCreateTest.java 를 실행.

   - EgovEnvCryptoAlgorithmCreateTest.java 파일을 선택하고 오른쪽 마우스 버튼을 클릭 > Run As > 2.  Java Application 을 선택한다.

 

   - 그랬더니 뭐가 나올줄 알았는데. 오른쪽 Console 창에 아무것도 나오지 않는다.

   - 다시 소스를 조금 수정한다.

      LOGGER.info 를 LOGGER.error 로 변경한다.

      logger 의 level이 디폴트로 error 로 설정되어 있는 것 같다.  logger 의 level을 수정해도 되지만 여기서는 편의상 소스를 수정했다. 수정하지 않아도 잘 나오는 경우에는 무시하고 넘어간다. 잘 나오는 경우에는 4번으로 이동한다. 

   - 다시 실행을 해준다. 

   - 그랬더니 아래와 같은 결과가 Console 창에 찍힌다. 

 

2020-03-11 14:51:21,118 ERROR [EgovEnvCryptoAlgorithmCreateTest] ------------------------------------------------------
2020-03-11 14:51:21,131 ERROR [EgovEnvCryptoAlgorithmCreateTest] 알고리즘(algorithm) : SHA-256
2020-03-11 14:51:21,131 ERROR [EgovEnvCryptoAlgorithmCreateTest] 알고리즘 키(algorithmKey) : egovframe
2020-03-11 14:51:21,163 ERROR [EgovEnvCryptoAlgorithmCreateTest] 알고리즘 키 Hash(algorithmKeyHash) : gdyYs/IZqY86VcWhT8emCYfqY1ahw2vtLG+/FzNqtrQ=
2020-03-11 14:51:21,163 ERROR [EgovEnvCryptoAlgorithmCreateTest] 알고리즘 블럭사이즈(algorithmBlockSize)  :1024

 

4. 알고리즘 키 Hash(algorithmKeyHash) 값을 기록해둔다. 

   - Console 창에 찍힌 것 중에 알고리즘 키 Hash(algorithmKeyHash) 값을 기록해둔다. 

      알고리즘 키 Hash(algorithmKeyHash) : gdyYs/IZqY86VcWhT8emCYfqY1ahw2vtLG+/FzNqtrQ=

 

 

이제는 암호문을 만들기 위한 과정을 진행한다.(오라클 비밀번호인 test1234 에 대한 암호문을 만드는 것 하고 있음을 잊지 않아야 한다. )

 

5.  context-crypto-test.xml 이라는 파일을 만들어준다.

 

 - 이 파일을 어디에 위치시켜야 하는지 몰라서... context-crypto.xml 파일이 있길래 그 옆에다가 위치를 시켰다.

      그러고 보니 경로가 대략적으로

C:\eGovFrameDev-3.9.0-64bit\workspace\egov\src\main\resources\egovframework\spring\com\ 이 하위가 되었다.

 

아래 소스를 이용해서 파일을 생성한다.(소스 복사는 위키 URL에 있는 것으로 한다.)

 

<?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>
<property name="basenames">
<list>
<value>classpath:/egovframework/egovProps/globals</value>
</list>
</property>
</bean>
 
    <egov-crypto:config id="egovCryptoConfig" 
     initial="false"
     crypto="true"
     algorithm="SHA-256"
     algorithmKey="(사용자정의 값)"
     algorithmKeyHash="(생성값)"
cryptoBlockSize="1024"
/>
 
</beans>

 

   - 위키 URL에서 아래 이미지의 영역이다. 

    - 소스를 수정한다. 

 

      algorithmKey="(사용자정의 값)"

      algorithmKeyHash="(생성값)"

 

      부분을

 

      algorithmKey="egovframe"

      algorithmKeyHash="gdyYs/IZqY86VcWhT8emCYfqY1ahw2vtLG+/FzNqtrQ="

      와 같이 값이 수정해준다. 

 

6. EgovEnvCryptoUserTest.java 파일을 생성한다.

* java 파일의 생성 위치를 ...\src\main\java 바로 밑에 두었다. 그렇지 않은 경우 패키징 관련 오류가 발생한다.

   

// 데이터베이스 연결 항목(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 = { 
"userId",         //데이터베이스 접속 계정 설정
"userPassword",   //데이터베이스 접속 패드워드 설정
"url",            //데이터베이스 접속 주소 설정
"databaseDriver"  //데이터베이스 드라이버
              };
 
 
LOGGER.info("------------------------------------------------------");
ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"classpath:/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());
}
 
}
 
}

 

   - 위키 URL 에서 소스는 카피한다.

 

   - 소스를 수정한다.

      - 위에서 처럼 LOGGER.infoLOGGER.error  수정한다.  LOGGER.info로 잘 나온다면 수정하지 않아도 된다.

      - classpath:/context-crypto-test.xml 부분도 수정해준다. context-crypto-test.xml 파일의 경로를 지정해주는 것인데 위에서 생성할 때 src\main\resources\egovframework\spring\com\ 이곳에 했으므로

classpath:/context-crypto-test.xml

classpath:/egovframework/spring/com/context-crypto-test.xml 로 수정한다.

 

7. EgovEnvCryptoUserTest.java를 실행한다.

   - 이 파일을 실행하여 암호화된 값을 얻을 수 있다.

   - 파일을 선택하고 오른쪽 마우스버튼 > Run As > 2 Java Application 을 선택한다. 

   - Console 창에 아래와 같은 값들이 찍혔다. 

2020-03-11 16:12:34,356 ERROR [EgovEnvCryptoUserTest] ------------------------------------------------------
2020-03-11 16:12:34,356 ERROR [EgovEnvCryptoUserTest] 사용자 아이디 원본(orignal):userId
2020-03-11 16:12:34,402 ERROR [EgovEnvCryptoUserTest] 사용자 아이디 인코딩(encrypted):%2Bn5a7BD6CPuNjHSUL9AK8w%3D%3D
2020-03-11 16:12:34,402 ERROR [EgovEnvCryptoUserTest] ------------------------------------------------------
2020-03-11 16:12:34,402 ERROR [EgovEnvCryptoUserTest] 사용자 비밀번호 원본(orignal):userPassword
2020-03-11 16:12:34,402 ERROR [EgovEnvCryptoUserTest] 사용자 비밀번호 인코딩(encrypted):Mqbtimqz%2BzalgOo7W5w6gA%3D%3D
2020-03-11 16:12:34,402 ERROR [EgovEnvCryptoUserTest] ------------------------------------------------------
2020-03-11 16:12:34,402 ERROR [EgovEnvCryptoUserTest] 접속 주소 원본(orignal):url
2020-03-11 16:12:34,402 ERROR [EgovEnvCryptoUserTest] 접속 주소 인코딩(encrypted):BqvAX86xPPqGQEFCB4aaKw%3D%3D
2020-03-11 16:12:34,402 ERROR [EgovEnvCryptoUserTest] ------------------------------------------------------
2020-03-11 16:12:34,402 ERROR [EgovEnvCryptoUserTest] 데이터 베이스 드라이버 원본(orignal):databaseDriver
2020-03-11 16:12:34,402 ERROR [EgovEnvCryptoUserTest] 데이터 베이스 드라이버 인코딩(encrypted):E4GtXk4i9yK0zjbiKDt5%2Fw%3D%3D
2020-03-11 16:12:34,402 ERROR [EgovEnvCryptoUserTest] ------------------------------------------------------

 

   - userPassword 대신에 test1234 라는 값을 넣어서 찍어보면 test1234에 대한 암호화 된 값을 얻을 수 있다.

      사용자 비밀번호 원본(orignal):test1234
      사용자 비밀번호 인코딩(encrypted):CWXsMtjygK9T3I8EcvnxwA%3D%3D

      라고 나온다.

 - 비밀번호 뿐만 아니라 다른 값들도 암호화된 값을 얻을 수 있다.

 

 

이렇게 해서 암호화된 값을 얻었다. 이제는 이것을 프로젝트에 적용시켜보자.

 

위 내용을 적용시키는 것은 아래 글에서 기술하였다.

https://webobj.tistory.com/76

 

globals.properties 의 정보에 대한 암호문 적용

이전 글에서 오라클 비밀번호에 대한 암호문을 생성하였다. https://webobj.tistory.com/75 globals.properties 의 정보에 대한 암호문 생성 globals.properties 에 있는 중요정보에 대해서 암호문을 생성할 수 있..

webobj.tistory.com

 

Done.

Comments