전자정부프레임워크 DB암호화
DB암호화를 하려하다보니 삽질을 조금 해서.. 약간 정리를해서 포스팅합니다.
보안 전문가가 아니다보니 Aria 암호화 방식에 대해서는 첨부하지 못하였습니다.
아래 URL에 가이드와 예제는 친절한 제가 첨부하였습니다.
가이드를 꼭 보고 예제를 보시면 금방 적용할 것같습니다. 더불어 제가 적은 삽질까지 보시면 더 좋고요.
가이드 : https://www.egovframe.go.kr/wiki/doku.php?id=egovframework:rte2:fdl:encryption_decryption
전자정부프레임워크 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(); } }
'보안' 카테고리의 다른 글
자바 SEED 암호화 예제 (0) | 2017.08.23 |
---|---|
비밀번호와 Hash(해시) (0) | 2017.08.22 |