본문 바로가기
Spring

전자정부 암호화/복호화 Encryption / Decryption

by 자바초보자 2015. 10. 7.
728x90

전자정부 암호화/복호화 Encryption / Decryption

Encryption / Decryption
분류없음
2013/01/24 18:19
1. 개요
1) 서비스 개요
- 암호화(Encryption, Ciphering)는 메시지의 내용이 불명확하도록 평문을 재구성하여 암호문을 만드는 것. 메시지의 재구성 방법을 암호화 알고리즘(Encryption Algorithm)이라고함. 암호화의 비밀성을 높이기 위해 키(Key)를 사용하기도 함. 복호화란(Decryption, deciphering)란 암호화의 역과정으로, 불명확한 메시지로부터 본래의 메시지를 환원하는 과정.
- Jasypt는 오픈 소스 Java library로 개발자는 암호화 관련 깊은 지식이 없어도 암복호화 프로그램을 개발할 수 있도록 지원함. 여기서는 암복호화 모듈로 사용한 API 중심으로 설명.
2) 주요 기능
a. Password Encoder
- Jasypt의 ConfigurablePasswordEncryptor를 통해 패스워드 인코딩을 지원한다.(기본 알고리즘 : SHA-256)
b. General Cryptography Service
- setAlgorithm(...), setBlockSize(...), setPasswordEncoder(...) 메소드를 통해 암복호화에 대한 알고리즘 등을 설정함.
- 기본 알고리즘은 PBEWithSHA1AndDESede, 기본 블럭사이즈는 1024로 처리된다.
- byte[], BigDecimal, File에 대하여 암호화 및 복호화 서비스를 제공한다.
c. ARIA Algorithm Cryptography Service
- 국정원의 ARIA 알고리즘을 통한 암복화 서비스를 제공한다.
- setBlockSize(...), setPasswordEncoder(...) 메소드를 통해 암복호화에 대한 정보를 설정한다.
- 기본 블럭사이즈는 1024로 처리된다.
- byte[], File에 대하여 암호화 및 복호화 서비스를 제공한다.
d. Digest Service
- Hash Function을 통한 Message Digest 서비스를 제공한다.
- setAlgorithm(...), setPlainDigest(...) 메소드를 통해 Digest 방식에 대한 정보를 설정한다.
- 기본 알고리즘은 SHA-256이며, 기본 PlainDigest 설정은 false로 처리된다.(PainDigest가 true이면 1000 iterations, 8 salt byte size가 적용된다.)
- byte[]에 대한 digest 및 matches 서비스가 제공된다.
2. 설명
a. Property 설정
# Message digest algorithm using EgovPasswordEncoder..
crypto.password.algorithm=SHA-256
# hashed password (ex: egovframe (SHA-256) =>gdyYs/IZqY86VcWhT8emCYfgY1ahw2vtLG+/FzNqtrQ=)
crypto.hashed.password=gdyYs/IZqY86VcWhT8emCYfqY1ahw2vtLG+/FzNqtrQ=
-crypto.password.algorithm: 패스워드 인코더에 사용될 hash function 알고리즘
-cypto.hashed.password: 패스워드에 대한 hash value(egovframework.rte.fdl.cryptograchy.EgovPasswordEncoder의 main메소드에 의해 해당 값을 얻어 기록한다.)
b. Properties 파일 지정
<context:property-placeholder
location="classpath*:/META-INF/spring/crypto_config.properties,classpath*:/META-INF/spring/password.properties" /><!-- recommended location method is using file prefix.. ex) "file:/home/properties/crypto_config.properties" -->
c. XML 설정
<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><bean id="generalCryptoService" class="egovframework.rte.fdl.cryptography.impl.EgovGeneralCryptoServiceImpl"><property name="passwordEncoder" ref="passwordEncoder" /><property name="algorithm" value="PBEWithSHA1AndDESede" /><!-- default : PBEWithSHA1AndDESede --><property name="blockSize" value="1024" /><!-- default : 1024 --></bean>
* Encryption texts Guide Program
@Test
public void testString() {
String[] testString = { "This is a testing...\nHello!",
"한글 테스트입니다...",
"?-=\\`[];',./" target=_blank>!@#$%^&*()_+|~{}:\"<>?-=\\`[];',./" };
try {
For (String str : testString) {
byte[] encrypted = cryptoService.encrypt(str.getBytes("UTF-8"), password);
byte[] decrypted = cryptoService.decrypt(encrypted, password);
assertEquals(str, new String(decrypted, "UTF-8"));
}
} catch (UnsupportedEncodingException uee) {
uee.printStackTrace();
fail();
}
}
* Encryption file Guide Program
@Test
public void testFile() {
String filePath = "/META-INF/spring/file/test.hwp";
File srcFile = new File(this.getClass().getResource(filePath).getFile());
File trgtFile;
File decryptedFile;
try {
trgtFile = File.createTempFile("tmp", "encrypted");
trgtFile.deleteOnExit();
cryptoService.encrypt(srcFile, password, trgtFile);
decryptedFile = File.createTempFile("tmp", "decrypted");
decryptedFile.deleteOnExit();
cryptoService.decrypt(trgtFile, password, decryptedFile);
assertTrue("Decrypted file not same!!",
checkFileWithHashFunction(srcFile, decryptedFile));
} catch (Exception ex) {
ex.printStackTrace();
fail(ex.getMessage());
}
}
* Message Digest Guide Program
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/META-INF/spring/*.xml" })
public class EgovDigestServiceTest {
@Resource(name="digestService")
EgovDigestService digestService;
@Test
public void testDigest() {
String data = "egovframe";
byte[] digested = digestService.digest(data.getBytes());
assertTrue(digestService.matches(data.getBytes(), digested));
}
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
String str = "egovframe";
EgovPasswordEncoder encoder = new EgovPasswordEncoder();
encoder.setAlgorithm("SHA-256");
System.out.println("Digested Password : " + encoder.encryptPassword(str));
}
}
728x90