상세 컨텐츠

본문 제목

MD5를 이용한 Message Digest

프로그래밍/JAVA

by 라제폰 2009. 1. 23. 16:54

본문

MD5를 이용한 Message Digest

 

Message Digest는 가변길이 데이터를 입력받아 일정 크기의 결과값을 산출해내는 방식을 사용

그리고 그결과 값에서 원래의 데이터를 재생해 낼 수 없도록 만듬

MD5(16)와 SHA(20) 의 두 알고리즘이 기본적으로 제공된다.

 

import java.io.*;
import java.security.*;
  
public class MessageDigester {
        public static void main(String[] args) throws Exception {
                if (args.length<1) {
                        System.out.println("사용법 : java MessageDigester 문서이름");
                        System.exit(1);
                }
 
                MessageDigest md=MessageDigest.getInstance("MD5");
                FileInputStream fis=new FileInputStream(args[0]);
 
                byte[] data=new byte[fis.available()];
                byte[] buf=new byte[1024];
 
                for (int length=0, offset=0; (length=fis.read(buf))!=-1; ) {
                        System.arraycopy(buf, 0, data, offset, length);
                        offset+=length;
                }
 
                fis.close();
 
                FileOutputStream fos=new FileOutputStream(args[0]+".md");
                fos.write(md.digest(data)); // 16바이트 크기의 byte[]배열저장 (MD5)
                fos.close();
                System.out.println(args[0]+".md 파일을 생성.");
        }
    }

}

import java.io.*;
import java.security.*;
  
public class MDChecker {
        public static void main(String[] args) throws Exception {
                if (args.length<2) {
                        System.out.println("사용법 : java MDChecker 문서이름 MD파일이름");
                        System.exit(1);
                }
 
                MessageDigest md=MessageDigest.getInstance("MD5");
                FileInputStream fis=new FileInputStream(args[0]);
 
                byte[] data=new byte[fis.available()];
                byte[] buf=new byte[1024];
 
                for (int length=0, offset=0; (length=fis.read(buf))!=-1; ) {
                        System.arraycopy(buf, 0, data, offset, length);
                        offset+=length;
                }
 
                fis.close();
 
                byte[] originMD=md.digest(data);
 
                fis=new FileInputStream(args[1]);
                byte[] loadedMD=new byte[fis.available()];
                fis.read(loadedMD);
                fis.close();
 
                if (checkMD(originMD, loadedMD)) {
                        System.out.println("동일한 문서임.");
                } else {
                        System.out.println("동일하지 않은 문서임.");
                }
        }
 
        static boolean checkMD(byte[] originMD, byte[] loadedMD) {
                if (originMD.length!=loadedMD.length) {
                        return false;
                }
 
                for (int i=0; i<originMD.length; i++) {
                        if (originMD[i]!=loadedMD[i]) {
                                return false;
                        }
                }
                return true;
        }
}


관련글 더보기