기본적인 암호화 처리를 해주는 메소드를 살짝 변경하였습니다. 암호화키를 저장해주지 못하기 때문에 별도의 페이지에서는 사용이 어려웠음.
필요하시면, 가져다 쓰셔도 됩니다. ^^ 암호화된 코드에다가 자기만의 암호화 처리 방법을 넣어서 해주시면 좋습니다. +_+)b
returnEncryptCode(String str) | 메소드는 입력받은 문자열을 암호화 한 다음, 암호화에 사용한 암호키와 암호화된 문자열을 합쳐서 반환합니다. |
public String returnDecryptCode(String str) | 메소드는 returnEncryptCode(String str) 메소드에서 처리한 암호화된 코드를 받으면, 특정 부분에서 잘라서 암호키를 키로 생성하고, 암호화된 코드를 넣어서 해독하여 해독된 문자열을 반환합니다. |
JSP에서 처리할 경우에는 returnEncryptCode(String str)에서 반환된 문자열을 저장하는 문자열 혹은 객체를 저장하는 방법만 고려하면 되겠다.
- package encrypt;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.InvalidKeyException;
import java.security.Key;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class LocalEncrypter{
//DESede 는 암호화시 사용되는 최대 키 사이즈를 지정하는 키워드임 : 관련페이지 내용 링크 - private static String algorithm = "DESede";
private static Key key = null;
private static Cipher cipher = null;
// 암호화 키를 발생시키는 메소드입니다.
// com.sun.crypto.provider.DESedeKey@ + 16진수 8자리
public LocalEncrypter() throws Exception {
key = KeyGenerator.getInstance( algorithm ).generateKey();
// private static String keystr = String.valueOf(key);
// System.out.println(key);
// System.out.println("암호화 키의 형태 :"+ keystr);
// System.out.println(keystr.length());
cipher = Cipher.getInstance( algorithm );
}
//1. str 을 입력 받아서 이를 암호한다. //2. 암호화 하는데 사용한 암호키를 encKey 로 문자열화 한다.
//3. encKey + str 값을 반환한다. 크기는 408 byte
public static String returnEncryptCode(String str) throws Exception {
byte [] encryptionBytes = null;
// 입력받은 문자열을 암호화 하는 부분
encryptionBytes = encrypt( str );
BASE64Encoder encoder = new BASE64Encoder();
//encoder.encode(encryptionBytes) 으로 encrypt 된 값 출력
String encodeString = encoder.encode(encryptionBytes);
// 키를 문자열로 바꿔주는 곳.
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);
oos.writeObject(key);
oos.close();
BASE64Encoder b64enc = new BASE64Encoder();
byte[] keyArr = bos.toByteArray();
String encKey = b64enc.encode(keyArr);
// System.out.println("문자열이 되어 저장된 키 : " + encKey);
// System.out.println("저장된 키의 길이 : " + encKey.length());
// System.out.println("암호화된 비밀번호 : " + encodeString);
/* // 암호화에 사용된 키값을 뽑아낸 수
String keycode = keystr.substring(34,42);
System.out.println("암호화에 사용된 키 : " + keycode);
String randomcode = returnRandomCode();
System.out.println("암호화된 코드 : " + encodeString);*/
return encKey + encodeString;
}
//1. DB에 저장되어 있는 408 byte 길이의 str을 받는다.
//2. 그중 0~384 까지의 암호화키(encKey)부분을 keycode로 뽑아낸다.
//3. keycode를 Key에 대입한다.
//4. 384~408 까지의 암호화된 문자열을 code로 뽑아낸다.
//5. code를 해독한다.
//6. 해독된 값을 반환한다.
public String returnDecryptCode(String str) throws Exception {
//복호화 하기 위해서는 암호화 키가 필요하다. ㅡㅅ-);;
// 그래서 생각해낸 것이, DB에 저장될 때, 암호화키를 한번에 집어넣고....
//substring 으로 잘라서 쓰는 것.
int strLength = str.length();
//암호화된 비밀번호에 저장되어 있는 암호화키를 추출.
String keycode = str.substring(0,384);
// 추출한 암호키를 KEY 형태로 다시 복구
BASE64Decoder b64dec = new BASE64Decoder();
byte[] b = b64dec.decodeBuffer(keycode);
ByteArrayInputStream bis = new ByteArrayInputStream(b);
ObjectInputStream ois = new ObjectInputStream(bis);
key = (Key) ois.readObject();
ois.close();
String code = str.substring(384, strLength);
// System.out.println("저장된 코드 길이 : " + strLength);
// System.out.println("암호화 사용키 : " + keycode);
// System.out.println("암호화된 코드: " + code);
BASE64Decoder decoder = new BASE64Decoder();
String decode = decrypt( decoder.decodeBuffer(code));
// System.out.println("Ecrypt 에서 해독한 것 : " + decode);
return decode;
}
// encryptionBytes = encrypt( input ), input을 변조하여 encryptionBytes에 대입함.
private static byte [] encrypt(String input) throws InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
cipher.init( Cipher.ENCRYPT_MODE, key );
byte [] inputBytes = input.getBytes();
return cipher.doFinal( inputBytes );
}
//decrypt( decoder.decodeBuffer(encodeString) ) 처리부분.
private static String decrypt(byte [] encryptionBytes) throws InvalidKeyException, BadPaddingException, IllegalBlockSizeException{
cipher.init( Cipher.DECRYPT_MODE, key);
byte [] recoveredBytes = cipher.doFinal( encryptionBytes );
String recovered = new String( recoveredBytes );
return recovered;
}
}
이 글은 스프링노트에서 작성되었습니다.
'허니몬의 IT 이야기 > 프로그래머, '코드 엔지니어'' 카테고리의 다른 글
090820, 자바의 정석, Java Tutorials, http://java.sun.com/docs/books/tutorial/index.html (0) | 2009.08.20 |
---|---|
090810, 프로젝트 발표를 위한 마인드맵 작성 (0) | 2009.08.11 |
JSP - JFreeChart 이용하여 차트 그래프 구현하기(JSP 페이지로만, 서블릿 No!!) (4) | 2009.08.01 |
먼저 스토리지 업계에 취업을 하게된 동생이 회사에서 받은 숙제 (0) | 2009.07.30 |
JSP 에서 넘겨받은 문자열의 charset 알아내기 (5) | 2009.07.30 |