728x90
반응형

MessageDigest 클래스 API 문서 URL

http://docs.oracle.com/javase/7/docs/api/java/security/MessageDigest.html

 

 

Java에서 MD5 hash 하려면 MessageDigest 클래스를 이용합니다.

MessageDigest 클래스에는 update() 메소드가 있는데, 이 메소드를 호출할때마다 객체 내에 저장된 MD5 digest 값이 계속해서 갱신이됩니다. 최종적으로 digest() 메서드를 호출하면 그 값을 가져올수있습니다.

 

 

MessageDigest 인스턴스 생성.

 

MessageDigest md = MessageDigest.getInstance("Algorithm Name"); 

 

MessageDigest md = MessageDigest.getInstance("MD5"); // "MD5 형식으로 암호화"

MessageDigest md = MessageDigest.getInstance("SHA1"); // "SHA1 형식으로 암호화"

 

 

MessageDigest Algorithms

The algorithm names in this section can be specified when generating an instance of MessageDigest.

 

 Algorithm Name

Description 

 MD2

The MD2 message digest algorithm as defined in RFC 1319.

 MD5

The MD5 message digest algorithm as defined in RFC 1321.

 SHA-1

 SHA-256

 SHA-384

 SHA-512

Hash algorithms defined in the FIPS PUB 180-2.


SHA-256 is a 256-bit hash function intended to provide 128 bits of security against collision attacks, while SHA-512 is a 512-bit hash function intended to provide 256 bits of security. A 384-bit hash may be obtained by truncating the SHA-512 output.

 출처 : http://docs.oracle.com/javase/7/docs/technotes/guides/security/StandardNames.html#MessageDigest

 

 

 

 

MD5 (Message-Digest algorithm 5) 

MD5는 메세지 축약 알고리즘으로써, 파일 무결성 검사용도로 많이 쓰이고 있다. 

128bit 의 해쉬를 제공하며, 암호와와 복호화를 통하여 보안용도로도 많이 쓰인다. 

하지만 암호화 결함이 발견되어 보안 용도로 사용할때에는 SHA와 같은 다른 알고리즘을 사용하는것이 권장되고 있다고 한다. 

 

SHA (Sechre Hash Standard) 

SHA(Secure Hash Algorithm, 안전한 해시 알고리즘) 함수들은 서로 관련된 암호학적 해시 함수들의 모음이다. 

여러 종류가 존재하며 그중 SHA-1은 SHA 함수들 중 가장 많이 쓰이며, TLS, SSL, PGP, SSH, IPSec 등 많은 보안 프로토콜과 프로그램에서 사용되고 있다. SHA-1은 이전에 널리 사용되던 MD5를 대신해서 쓰이기도 한다. 혹자는 좀 더 중요한 기술에는 SHA-256이나 그 이상의 알고리즘을 사용할 것을 권장한다.

 

 [코드]

EncryptUtil.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.logging.Logger;

public class EncryptUtil {
    
    //Logger java.util.logging.Logger.getLogger(String name)
    private static final Logger logger = Logger.getLogger(EncryptUtil.class.getName());
    
    //Type1
    
    //MD5
    public static String getMD5(String str){
        
        String rtnMD5 = "";
        logger.info("str:"+str);
        logger.info("str.getBytes():"+Arrays.toString(str.getBytes()));
        
        try {
            //MessageDigest 인스턴스 생성
            MessageDigest md = MessageDigest.getInstance("MD5");
            //해쉬값 업데이트
            md.update(str.getBytes());
            //해쉬값(다이제스트) 얻기
            byte byteData[] = md.digest();

            logger.info("byteData[]:"+Arrays.toString(byteData));
            
            StringBuffer sb = new StringBuffer();
            
            //출력
            for(byte byteTmp : byteData) {
                sb.append(Integer.toString((byteTmp&0xff) + 0x100, 16).substring(1));
                /*
                int tmp1 = (byteTmp & 0xff);
                int tmp2 = ((byteTmp&0xff) + 0x100);
                
                System.out.println(byteTmp +" : "+ tmp1 +" : "+ tmp2 
                        +" : "+Integer.toString((byteTmp&0xff)+0x100, 16)
                        +" : "+(Integer.toString((byteTmp&0xff) + 0x100, 16).substring(1)));
                */

                
                // byte 타입의 범위 : -128~127 ( -2^7 ~ 2^7-1 )
                //-129 + 256 = 127
                // 0x100 = 256
            }
            rtnMD5 = sb.toString();
        } catch (Exception e) {
            e.printStackTrace(); 
            rtnMD5 = null
        }
        return rtnMD5;
    }
    
    
    //SHA-256    
    public static String getSHA256(String str) {
        String rtnSHA = "";
        
        try{
            MessageDigest sh = MessageDigest.getInstance("SHA-256"); 
            sh.update(str.getBytes()); 
            byte byteData[] = sh.digest();
            StringBuffer sb = new StringBuffer(); 
            
            for(int i = 0 ; i < byteData.length ; i++){
                sb.append(Integer.toString((byteData[i]&0xff) + 0x100, 16).substring(1));
            }
            rtnSHA = sb.toString();
            
        }catch(NoSuchAlgorithmException e){
            e.printStackTrace(); 
            rtnSHA = null
        }
        return rtnSHA;
    }
    
    
    //Type2. BigInteger를 이용하여 구현.
    
    public static String getEncryptMD5(String a_origin) throws UnsupportedEncodingException{
        String encryptedMD5 = "";
        MessageDigest md = null;
                
        try {
            md = MessageDigest.getInstance("MD5");
//            md.update(a_origin.getBytes());
            md.update(a_origin.getBytes(), 0, a_origin.getBytes().length);            
            byte byteData[] = md.digest();
            logger.info("byteData[]:"+(Arrays.toString(byteData)));
            encryptedMD5 = new BigInteger(1, byteData).toString(16); 
            
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        
        return encryptedMD5;
    }
        
    public static String getEncryptSHA256(String a_origin){
        String encryptedSHA256 = "";
        MessageDigest md = null;
        
        try {
            md = MessageDigest.getInstance("SHA-256");
            md.update(a_origin.getBytes(), 0, a_origin.length());
            encryptedSHA256 = new BigInteger(1, md.digest()).toString(16); 
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        
        return encryptedSHA256;
    }
    
}//class

EncTestProgram.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;


public class EncTestProgram {
    public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException {
        
        String strTest = "0123456789abcdef!";
//        String strTest = "가나다라마바사abcd012345#"; 
        
        //MD5 테스트
        String strMD5 = EncryptUtil.getMD5(strTest);        
        System.out.println("[strMD5]=>getMD5()\n"+strMD5);            
        String strMD5_2 = EncryptUtil.getEncryptMD5(strTest);
        System.out.println("[strMD5]=>getEncryptMD5()\n"+strMD5_2);
        System.out.println("비교=> "+strMD5.equals(strMD5_2));        
        
        System.out.println("============================================");
        
        //SHA-256 테스트
        String strSHA = EncryptUtil.getSHA256(strTest);
        System.out.println("[strSHA]=>getSHA256()\n"+strSHA);
        String strSHA2 = EncryptUtil.getEncryptSHA256(strTest);
        System.out.println("[strSHA]=>getEncryptSHA256()\n"+strSHA2);
        System.out.println("비교=> "+strSHA.equals(strSHA2));
        
    }
}

 

 

 

 

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,