'허니몬의 IT 이야기'에 해당되는 글 397건

허니몬의 IT 이야기/프로그래머, '코드 엔지니어'

기본적인 암호화 처리를 해주는 메소드를 살짝 변경하였습니다.  암호화키를 저장해주지 못하기 때문에 별도의 페이지에서는 사용이 어려웠음.

 

필요하시면, 가져다 쓰셔도 됩니다. ^^ 암호화된 코드에다가 자기만의 암호화 처리 방법을 넣어서 해주시면 좋습니다. +_+)b

returnEncryptCode(String str)  메소드는 입력받은 문자열을 암호화 한 다음, 암호화에 사용한 암호키와 암호화된 문자열을 합쳐서 반환합니다.
public String returnDecryptCode(String str)  메소드는 returnEncryptCode(String str) 메소드에서 처리한 암호화된 코드를 받으면, 특정 부분에서 잘라서 암호키를 키로 생성하고, 암호화된 코드를 넣어서 해독하여 해독된 문자열을 반환합니다.

 

JSP에서 처리할 경우에는 returnEncryptCode(String str)에서 반환된 문자열을 저장하는 문자열 혹은 객체를 저장하는 방법만 고려하면 되겠다.

 

  1. 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 는 암호화시 사용되는 최대 키 사이즈를 지정하는 키워드임 : 관련페이지 내용 링크
  2.     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 이야기/프로그래머, '코드 엔지니어'

인터넷 검색을 통하여 찾아본 구현 방법들은 서블릿에서 저장된 것들을 처리하는 방법들 뿐이었음.

나름 독자적인(?!) 해석을 통하여 JSP로만 구현하는 방법을 터득했다. 이를 이용할 예정임.

현재 진행중인 프로젝트가 완료되면 특별한 기능이 있을 경우, 기재를 하여 설명드리도록 하겠음.


JFeeChart 구현과 관련된 JAR 파일들

1) jfreechart-1.0.0-pre2.jar

2) jcommon-1.0.0-pre2.jar

메뉴얼 API : http://www.jfree.org/jfreechart/api/javadoc/index.html


  1. <%@ page language="java" contentType="text/html; charset=EUC-KR"  pageEncoding="EUC-KR"%>
    <%@ page import="java.io.*" %>
    <%@ page import="org.jfree.data.general.DefaultPieDataset"%>
    <%@ page import="org.jfree.chart.JFreeChart"%>
    <%@ page import="org.jfree.chart.plot.PiePlot"%>
    <%@ page import="org.jfree.chart.ChartRenderingInfo"%>
    <%@ page import="org.jfree.chart.servlet.ServletUtilities"%>
    <%@ page import="org.jfree.chart.urls.StandardPieURLGenerator"%>
    <%@ page import="org.jfree.chart.entity.StandardEntityCollection"%>
    <%@ page import="org.jfree.chart.ChartFactory"%>
    <%@ page import="org.jfree.chart.ChartUtilities"%>
    <%@ page import="org.jfree.data.general.PieDataset"%>
    <%@ page import="org.jfree.data.category.DefaultCategoryDataset"%>
    <%@ page import="org.jfree.chart.plot.PlotOrientation"%>
    <%@ page import="org.jfree.chart.servlet.*"%>
    <%@ page import="com.oreilly.servlet.*" %>
    <%@ page import="com.oreilly.servlet.multipart.*" %>


    <!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>JChart 연습하기</title>
    </head>
    <body>
       <%
           DefaultPieDataset ds = new DefaultPieDataset();
           ds.setValue("홍길동", new Double(40.0));
           ds.setValue("홍길숙", new Double(25.0));
           ds.setValue("기타", new Double(15.0));
          
           JFreeChart chart = ChartFactory.createPieChart("득점분포", ds, true, true, false);
           chart.setBackgroundPaint(java.awt.Color.white);
            chart.setTitle("JChart 연습하기");
            
            ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
          
            
           //PNG 파일명을 만들어내기
            String fileName = ServletUtilities.saveChartAsPNG(chart, 600, 300, info, session);           
          
            System.out.println("파일명 : " +fileName);
            
           //특정 임시 폴더에 이미지 파일을 만들어냄.
            String dir = application.getRealPath("/upload/"); // 파일경로 지정
            dir = "D:\\" + dir.substring(3) + "/";
            String filepath = dir + fileName;
            //System.out.println("File path = "+ filepath);
     
            FileOutputStream fos = new FileOutputStream(new File(filepath));
            File f = new File(filepath);
            ChartUtilities.writeChartAsPNG(fos, chart, 600, 300);
            
            String graphURL = request.getContextPath() + "/upload/" + fileName;
            //System.out.println(graphURL);
           %>
           <img src="<%=graphURL%>"/> <!--//파일 경로와 파일명을 받아서 차트를 보여줌-->

    </body>
    </html>

● 파일명 : jfreechart-2348981821190451270.png (파일명은 ServletUtilities.saveChartAsPNG(chart, 600, 300, info, session); 에 의해서 임의 지정됨)
● File path = D:\workspace\project\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\WomanHappy\upload/jfreechart-2348981821190451270.png  // 웹 서버에 저장된 실제 주소
● /WomanHappy/upload/jfreechart-2348981821190451270.png // 서버에 저장된 주소

JFreeChart.JPG <결과물>

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

허니몬의 IT 이야기/프로그래머, '코드 엔지니어'
1. 자바를 이용하여
2. 화면은 Swing 으로 구성.
3. 클라이언트에서 서버에 접속을 한다.
4. 클라이언트에서 폴더를 선택하면, 그 폴더 이하 모든 파일을 서버로 전송한다.
5. TCP/IP 기반으로 하여
  5.1. FTP
  5.2. SOCKET
  5.3. HTTP
  5.4. RMI
6. 클라이언트에서 전송 방식을 선택
7. 서버에서 WEB으로 결과 조회(전송 성공/실패), 모니터링(현재 전송형황)
8. 서버에서는 각각의 전송방식에 따라서
  FTP, SOCKET, WAS, RMI가 각각 실행되고 있어야 한다.
9. DB로 성공건수, 실패건수 기록
8. 속도 높이고 안정적으로...

동생이 받은 숙제를 핸폰으로 급히 찍었습니다. 자바를 배운 아이에게 닷넷도 공부를 하라고 요구했다는 군요.... +_+)

흠... 우선 취업을 축하하면서, 현재 교육생으로서 센터에서 배우고 있는 것과 현업에서 요구하는 기술수준의 차이를 절실하게 깨달은 기회였습니다. 끊임없이 공부하고 끊임없이 연구해야하는 IT 업계 종사자로서 사회에 나갈 채비를 해야겠습니다.

동생의 강조사항.

"면접은 말빨입니다. ㅡㅅ-)b"

'서류통과만 잘되면, 나름 면접은 자신있다.' 라고 생각은 하지만 회사에서 요구하는 인재상이 아닐 수도 있으므로... 지금부터라도 준비를 합시다... +_+)
허니몬의 IT 이야기/프로그래머, '코드 엔지니어'
if ( keyword != null ) {
     String charset[] = {"euc-kr", "ksc5601", "iso-8859-1", "8859_1", "ascii"};
     
     for(int k=0; k<charset.length ; k++){
             for(int l=0 ; l<charset.length ; l++){
                     if(k==l){
                             continue;
                     }else{
                             System.out.println(charset[k]+" : "+charset[l]+" :"+new String(keyword.getBytes(charset[k]),charset[l])+"<br>");
                     }
             }
     }
   }

ㅡㅅ-);; charset 형만 알아내는 거지, 그거에 대한 반환타입이 없어서...
조건식에다가 쓸 수가 없잖아!!!

자바내에서는 받는 파라메타의 charset 이 무엇인지 알아내는 메소드는 없는 듯 합니다. ㅡㅅ-);;
위의 식은 받은 문자열(keyword)을 반복문을 돌려서 문자셋을 바꿔가면서 출력하는 코드입니다.

출력결과를 확인하고서 파라메터가 어떤 charset으로 들어오는지 확인하고서 거기에 맞춰서 처리를 해줘야 한다.
우리 프로젝트 처리를 진행하면서는 크게 쓸모는 없었다. 자바스크립트를 통해서 파라메터를 생성해서 받는 것은
ISO8895_1 타입으로 하는 걸 알고 있으니까, 특정 조건을 만족했을 때, 해당 파라메터를 인코딩하도록 만들어 처리했다.


선생님께 여쭈어 또다른 방법을 알아냈다. get 방식으로 파라메터를 전달하는 자바스크립트 방식일 경우에 유용하다.
예 : javascript:location.href="list.jsp?page=555&subpage=444  의 경우

          //searchform 폼에서 입력한 값이 있을 경우 넣어줄 것 불러오기
          if ((request.getMethod()).equalsIgnoreCase("get") && category != null && keyword != null ) {
              keyword = new String(keyword.getBytes("ISO8859_1"), "EUC_KR");
          }

request 의 method 방법을 알아내는 메소드(함수) getMethod() 를 이용해서 "get" 방식을 경우에 변환해주는 방법입니다.

또다른 방법은 <form method="post" action="">을 하나 만들어서 그 안에다가 <input type="hidden" name=""> 으로 해서  해서 form.submit() 방식으로 다음페이지에서 필요한 값들을 넘기는 방법이 있다.


AJAX 실행한 단계에서 다음 페이지에서는
equest.setCharacterEncoding("euc-kr"); 의 식으로 코딩을 지정해주면 글자가 깨진다는 점을 주의하라.


허니몬의 IT 이야기
사용자 삽입 이미지

오늘 한국형 마이크로 블로그의 대표주자라고 할 수 있는 미투데이의 리뉴얼이 있었습니다. 보시다시피 깔끔한 디자인으로 환경설정에서 자신이 원하는 스타일에 맞추어서 디자인을 변경할 수 있게 되었습니다.

^^; 현재 프로젝트를 하느라고 블로그를 제대로 쓰고 있지 못하네요. 오며가며 모바일 페이지에 접속하여 글을 남기는 것이 일과가 되어버렸습니다. 깔끔한 디자인은 마음에 드네요. ^^; 아직 제대로 써보지를 못해서 당장은 무어라 말씀드리기 어렵군요. ^^
1 ··· 53 54 55 56 57 58 59 ··· 80
블로그 이미지

Email : ihoneymon@gmail.com 안녕하세요, 꿀괴물 입니다. ^^ 멋진 비행을 준비 하는 블로그 입니다. 만능형 인간이 되어 많은 이들에게 인정받고, 즐겁고 행복하게 살기를 간절히 원합니다!! 달콤살벌한 꿀괴물의 좌충우돌 파란만장한 여정을 지켜봐주세요!! ^^

허니몬