본문으로 바로가기
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


전자정부프레임워크 DB암호화


DB암호화를 하려하다보니 삽질을 조금 해서.. 약간 정리를해서 포스팅합니다.

보안 전문가가 아니다보니 Aria 암호화 방식에 대해서는 첨부하지 못하였습니다.

아래 URL에 가이드와 예제는 친절한 제가 첨부하였습니다.

가이드를 꼭 보고 예제를 보시면 금방 적용할 것같습니다. 더불어 제가 적은 삽질까지 보시면 더 좋고요.


가이드 : https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte2:fdl:encryption_decryption

예제 : http://www.egovframe.go.kr/cop/bbs/selectBoardArticle.do?nttId=1077&bbsId=BBSMSTR_000000000001&menu=2


전자정부프레임워크 DB암호화 목차

1. POM.xml에 dependency 추가

2. properties 추가

3. xml 설정

4. Sample 예제

5. 삽질 경험담


1. POM.xml에 dependency 추가

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


2. properties 추가

#default (SHA-256)
crypto.password.algorithm=SHA-256
#password = egovframe
crypto.hashed.password=gdyYs/IZqY86VcWhT8emCYfqY1ahw2vtLG+/FzNqtrQ=


3. 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:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <context:component-scan base-package="egovframework" />
    
    <context:property-placeholder location="classpath:crypto.properties" />

    <bean id="passwordEncoder" class="egovframework.rte.fdl.cryptography.EgovPasswordEncoder">
        <property name="algorithm" value="${crypto.password.algorithm}" /><!-- default : SHA-256 -->
        <property name="hashedPassword" value="${crypto.hashed.password}" />
    </bean>
    
    <bean id="ARIACryptoService" class="egovframework.rte.fdl.cryptography.impl.EgovARIACryptoServiceImpl">
        <property name="passwordEncoder" ref="passwordEncoder" />
        <property name="blockSize" value="1025" /><!-- default : 1024 -->
    </bean>
    
    <bean id="digestService" class="egovframework.rte.fdl.cryptography.impl.EgovDigestServiceImpl">
        <property name="algorithm" value="SHA-256" /><!-- default : SHA-256 -->
        <property name="plainDigest" value="false" /><!-- default : false -->
    </bean>
</beans>


4. 예제

package egovframework.ariacrypto; import java.io.UnsupportedEncodingException; import org.jasypt.contrib.org.apache.commons.codec_1_3.binary.Base64; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericXmlApplicationContext; import org.springframework.stereotype.Controller; import egovframework.rte.fdl.cryptography.EgovPasswordEncoder; import egovframework.rte.fdl.cryptography.impl.EgovARIACryptoServiceImpl; public class Crypto { public static String password ="egovframe"; static public EgovARIACryptoServiceImpl cryptoService; static public EgovPasswordEncoder passwordEncoder; public static void main(String[] args) { ApplicationContext ctx = new GenericXmlApplicationContext("classpath:context-crypto.xml"); passwordEncoder = (EgovPasswordEncoder) ctx.getBean("passwordEncoder"); cryptoService = (EgovARIACryptoServiceImpl) ctx.getBean("ARIACryptoService"); getHashedPassword(); } public static void testString() { System.out.println("==========testString()=========="); String[] testString = { "This is a testing...\nHello!", "한글 테스트입니다...", "!@#$%^&*()_+|~{}:\"<>?-=\\`[];',./" }; try { int i = 0; for (String str : testString) { System.out.println("순번:" + ++i); byte[] encrypted = cryptoService.encrypt(str.getBytes("UTF-8"), password); byte[] decrypted = cryptoService.decrypt(encrypted, password); System.out.println(encrypted); System.out.println(new String(decrypted, "UTF-8")); } } catch (UnsupportedEncodingException uee) { uee.printStackTrace(); } } public static void testBase64String() { System.out.println("==========testBase64String()=========="); String[] testString = { "This is a testing...\nHello!", "한글 테스트입니다...", "!@#$%^&*()_+|~{}:\"<>?-=\\`[];',./" }; try { int i = 0; for (String str : testString) { System.out.println("순번:" + ++i); byte[] converted = Base64.encodeBase64(str.getBytes()); byte[] encrypted = cryptoService.encrypt(converted, password); byte[] decrypted = cryptoService.decrypt(encrypted, password); System.out.println(encrypted); System.out.println(new String(Base64.decodeBase64(decrypted))); } } catch (Exception uee) { uee.printStackTrace(); } } public static void getHashedPassword() { System.out.println("==========getHashedPassword()=========="); String testString = "egovframe"; try { System.out.println("Plain Password:" + testString); String hasedPasswrod = passwordEncoder.encryptPassword(testString); System.out.println("Hased Password:" + hasedPasswrod); } catch (Exception uee) { uee.printStackTrace(); } } }


5. 삽질 경험담

ERROR egovframework.rte.fdl.cryptography.impl.EgovARIACryptoServiceImpl - password not matched!!!

암호화 방식을 모른 상태에서 막 복사 붙여넣기하다가 에러가 발생했습니다.

왜 발생했을까 물어보니 실제 암호화하는 것은 properties 파일에 있는 crypto.hashed.password 라는 것을 알게 되었습니다.

cryptoService.encrypt(converted, password); 

인자에 저 password는 무엇일까 ? 왜 평문을 넣는거지..?

확인해보니 password에 들어가는 String은 properties안에 Hash function 알고리즘 및 hashed된 패스워드와 비교하기 위해 필요한 것이었습니다. getHashedPassword()함수로 패스워드를 새로 생성하여 소스 그리고 properties에 둘다 꼭 변경해야합니다.


아래 예제는 그냥 어쩌다 테스트하다보니 1글자일 경우 이상하게 복호화가 이상하게 깨져서.. 인코딩 디코딩을 두 번씩 했더니 정상적으로 나와서 첨부해보았습니다. 안 좋은 소스일 수도 있어서 참고만 하시라는 의미이고 더 좋은 개선점이 있다면 말씀해주세요.

    public void Base64String() {
        System.out.println("==========testBase64String()==========");
        
        String[] testString = { "This is a testing...\nHello!",
                                "한글 테스트입니다...",
                                "!@#$%^&*()_+|~{}:\"<>?-=\\`[];',./",
                                "1",
                                "a",
                                "qw",
                                "!" };
        
        try {
            int i = 0;
            for (String str : testString) {
                
                System.out.println("순번:" + ++i);
                
                /////////////////////////암호화
                byte[] converted = Base64.encodeBase64(str.getBytes());
                byte[] encrypted = cryptoService.encrypt(converted, password);
                
                String encValue = new String(Base64.encodeBase64(encrypted));
                System.out.println(encValue);   
                
                ////////////////////////////////////////////////
                byte[] byteEncValue = encValue.getBytes();
                byte[] convert = Base64.decodeBase64(byteEncValue);
                
                /////////////////////////복호화
                byte[] decrypted = cryptoService.decrypt(convert, password);
                System.out.println(new String(Base64.decodeBase64(decrypted)));
                
                
                System.out.println("==============================================");
            }
        } catch (Exception uee) {
            uee.printStackTrace();
        }
    }


저도 예제를 첨부합니다.  @Autowired를 쓰려고하는데 왜 안되는지... null 나네요 그래서 그냥 .getBean으로 가져왔습니다..


'보안' 카테고리의 다른 글

자바 SEED 암호화 예제  (0) 2017.08.23
비밀번호와 Hash(해시)  (0) 2017.08.22