2011년 6월 9일 목요일

자바보안과 암호화 - 1

Chapter 1 개념
환경 설정
개발 환경 설정에는 다음과 같이 3가지 방법이 있다.
  1. JSDK 1.3이하 버젼 & JCE 1.2.1 글로벌 버전 JCE 1.2.1 버전은 http://java.sun.com 사이트에서 회원가입을 해야지 Down 받을수 있다. JCE는 미국에서 무기로 관주 되기 때문에 글로벌 버전은 미국, 케나다 버전과 다르다.
  2. JSDK 1.4에는 Java Cryptography Extension 1.2.1 버전이 포함되어 있다.
  3. 다운 받은 JCE의 압축을 풀고 lib방 밑에 있는 모든 jar파일을[JavaHome]\jre\lib\ext방으로 카피한다. 그리고 JCE 알고리즘을 사용하기 위해서 SunJCE 프로바이터를 설치 해야 한다.

설치하기 위해서는 [JavaHome]\jre\lib\security\java.security 파일에 다음을 추가한다.
security.provider.1=sun.security.provider.Sun,
security.provider.2=com.sun.crypto.provider.SunJCE


서로 다른 개념들
  1. 보안 != 암호 : 애플리케이션에 암호를 추가하는 것이 애플리케이션을 안전하게 하지 못한다.
  2. 올바른 보안 모델 != 버그가 없는 구현 : 훌륭한 보안 모델이라고 해도 구현 과정에서의 버그는 공겨자의 대상이 있다.
  3. 테스트 != 공식적인 증명
  4. 컴포넌트 보안 != 전반적인 시스템 보안
  5. 자바 보안 != 애플릿 통제
    Base 64
    Base64는 바이트 배열을 아스키 문자로 표현하기 위한 시스템이다. Base64체계는 RFC1521의 Section5.2에 완전하게 기술되어 있다. sun.misc.BASE64Encoder는 바이트 배열을 가지고 base64 disit를 가지 문자열을 생성한다. 이에 대응하는 클래스 BASE64Decoder는 문자열을 가지고 원래 바이트 배열을 생성한다.
    Sun에서는 Base64를 지원할 의무가 없다.


    예제 프로그램
    //-- Masher 메시지 축약
    package test.crypto.part1;
    import java.security.*;
    import java.io.*;
    import sun.misc.*;

    public class Masher  {
       public Masher() {
       }

       private void exec(String targetFileName) {
           try {
               // MD5알고리즘을 이용한 메시지 축약 객체를 생성한다.
               MessageDigest md = MessageDigest.getInstance("MD5");
               FileInputStream fin = new FileInputStream(targetFileName);
               byte[] buffer = new byte[8192];
               int length;
               while ( (length = fin.read(buffer)) != -1 ) {
                   md.update(buffer,0,length);
               }
               byte[] raw = md.digest();

               // 출력 가능한 문자열로 변환한다.
               BASE64Encoder encoder = new BASE64Encoder();
               String base64 = encoder.encode(raw);
               System.out.println(base64);
           } catch(NoSuchAlgorithmException nalgoe) {
               System.err.println(nalgoe);
           } catch(FileNotFoundException fnote) {
               System.err.println(fnote);
           } catch(IOException ioe) {
               System.err.println(ioe);
           }
       }

       public static void main(String[] args) {
           if(args.length < 1) {
               System.out.println("메시지 축약의 대상 파일을 선택하여 주십시요");
               System.exit(0);
           }

           String targetFileName =  args[0];
           Masher masher = new Masher();
           masher.exec(targetFileName);
       }
    }


    매시지 축약은 데이터를 증명하지만, 메시지에 대해서는 전혀 없다.
    // DES알고리즘을 이용한 대칭키 암복호화
    package test.crypto.part1;
    import javax.crypto.*;
    import java.io.*;
    import java.security.*;
    import sun.misc.*;

    public class SecretWriting  {
    public SecretWriting() {
    }

    public void exec(String args[]) throws Exception{

    // key를 얻어 생성한다.
    Key key;
    try{
    ObjectInputStream in = new ObjectInputStream(new FileInputStream("SecretKey.ser"));
    key = (Key)in.readObject();
    in.close();
    } catch (FileNotFoundException fnote) {
    // ser Key 파일이 없으면 실행된다.
    // DES 대칭키 알고리즘을 정의해서 키 제너레이터를 생성한다.
    KeyGenerator keygenerator = KeyGenerator.getInstance("DES");
    // 랜덤 함수로 초기화한다.
    keygenerator.init(new SecureRandom());
    // 키를 생성한다.
    key = keygenerator.generateKey();
    // 생성된 키 객체를 바이널리 파일로 저장한다.
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("SecretKey.ser"));
    out.writeObject(key);
    out.close();
    }

    Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

    // -e문자열이 없으면 복호화 한다. 다음은 암호화 한다.
    if(args[0].indexOf("e") != -1) {
    cipher.init(Cipher.ENCRYPT_MODE,key);
    String amalgam = args[1];
    for(int i = 2; i < args.length; i++) {
    amalgam += " "+args[i];
    }

    byte[] stringBytes = amalgam.getBytes("UTF8");
    byte[] raw = cipher.doFinal(stringBytes);
    BASE64Encoder encoder = new BASE64Encoder();
    String base64 = encoder.encode(raw);
    System.out.println(base64);
    } else if(args[0].indexOf("d") != -1) {
    cipher.init(Cipher.DECRYPT_MODE,key);
    BASE64Decoder decoder = new BASE64Decoder();
    byte[] raw = decoder.decodeBuffer(args[1]);
    byte[] stringBytes = cipher.doFinal(raw);
    String result = new String(stringBytes, "UTF8");
    System.out.println(result);
    }
    }

    public static void main(String[] args) throws Exception{

    if(args.length < 2) {
    System.out.println("사용예 java tesst.crypto.part1.SecretWriting -[e|d] STRING1 STRING2 ...");
    System.exit(0);
    }

    SecretWriting secretWriting = new SecretWriting();
    secretWriting.exec(args);
    }
    }

    DES 알고리즘은 동일한 키를 생성하여 암호화와 복호화가 이루워지는 대칭키 방식이다.

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...