● 관련내용 : http://www.okjsp.pe.kr/seq/62218

① 입력된 데이터를 암호화하는 서블릿 작성

파일명 : LocalEncrypter.java

  1. package encrypt;

    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;
     
        public static String returnEncryptCode(String str) throws Exception {
            byte [] encryptionBytes = null;
           
            setUp();
                  
            // 입력받은 문자열을 암호화 하는 부분
            encryptionBytes = encrypt( str );
            BASE64Encoder encoder = new BASE64Encoder();
             String encodeString = encoder.encode(encryptionBytes);
             //encoder.encode(encryptionBytes) 으로 encrypt 된 값 출력
            return encodeString;
        }

       private static void setUp() throws Exception {
            key = KeyGenerator.getInstance( algorithm ).generateKey();
            cipher = Cipher.getInstance( algorithm );
        }

        public static String returnDecryptCode(String str) throws Exception {
            BASE64Decoder decoder = new BASE64Decoder();
            String decode = decrypt( decoder.decodeBuffer(str) );
            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;
        }
     
    }

 

② 간단한 입력폼 : InputCode.jsp

이 곳에서 문자열을 입력받아, InputCodeProc.jsp 에서 <jsp:useBean> 을 활용하여 암호화(변조, 복조)를 실시한다.

  1. <%@ page language="java" contentType="text/html; charset=EUC-KR"
        pageEncoding="EUC-KR"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
    <title>Insert title here</title>
    </head>
    <body>
        <form method=post action='InputCodeProc.jsp'>
        <table border='1'>
        <tr><th>키워드입력</th><td><input type='text' name='code'></td></tr>
        <tr><td colspan='2'><input type='submit'></td></tr>
        </form>
    </body>
    </html>

 

③ 암호화처리 : InputCodeProc.jsp

InputCode.jsp 에서 code 파라메터를 받아내서 LocalEncrypter.java 에서 returnEncryptCode(code); 로 넣어준다.

  1. <%@ page language="java" contentType="text/html; charset=EUC-KR"  pageEncoding="EUC-KR"%>
    <jsp:useBean id="enc" class="encrypt.LocalEncrypter" />
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
    <title>Insert title here</title>
    </head>
    <body>
        <%
            String str = request.getParameter("code");
            String encryptcode = enc.returnEncryptCode(str);       
        %>
        <h3> 입력받은 코드 Encrypt 처리결과 : <%= encryptcode %></h3>
        <hr>
        <%
            String decryptcode = enc.returnDecryptCode(encryptcode);
        %>
        <h3> Encrypt 된 문자열을 Decrypt 한 결과 : <%= decryptcode %></h3>
        <hr>

    </body>
    </html>

이 글은 스프링노트에서 작성되었습니다.



실행결과 :

실행결과

차후에 사용자 비밀번호 입력 및 처리를 위해서 사용할 수 있을 듯 하다. ㅡㅅ-); 비밀번호를 그대로 문자열 그대로 저장할 수는 없지 않겠는가??

  1. realDevil 2011.07.27 10:43 신고

    제가 이 소스를 주소창에 사용자 id와 passwd를 암호화한 상태로 넘기기 위해서 사용해 보았씁니다.
    써본 결과 key값을 항시 만들어지는 코드로 인하여 parameter값으로 넘길시에 decrypt 할시에 생각지도 못한 에러가 났습니다.

    포스팅 하신 날짜가 오래되신걸 보니 옛날에 하셨던거 같은데... 이런말 씁 드려서 죄송합니다.ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
    그래도 많은 도움이 되었습니다.^^

    • ^^; 기본적으로 주소창에 ID와 Password를 파라메터로 넘기는 GET 방식은 사용하지 않습니다.

      중요한 정보들의 경우에는 POST 방식으로 전달을 하고, 암호화방식도 조금더 복잡해졌고, DES 방식은 잘 안쓰죠...

      조금 더, 다른자료를 찾아보시면 좋을 것 같습니다.
      저도 이 코드를 꽤 오래전에 작성한지라... 기억도 잘 나지 않네요. ㅡ0-);;

+ Recent posts