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)); } } | | |
|