해쉬의 기능이 메시지의 변조 유무룰 확인할 수 있다고 이야기한 바 있다.
문제는 어떤 경로된 원본 데이터와 알고리즘을 알게되면 해쉬값을 만들어 낼 수 있다는
단점이 있다. 그래서 특정 KEY를 해쉬를 과정에서 사용하여 원본을 안다고 하더라도
해쉬값을 유추할 수 없도록 하는 기법을 메시지 인증 코드(MAC, Message Authentication Code)라고 한다.
MAC은 해쉬 알고리즘을 이용할 수 도 있고 암호화 알고리즘을 이용하여 만들 수 있지만 원본 데이터의
무결성을 확인할 수 있는 메시지 축약값이 나온다는 점에서는 해쉬와 동일한다.
특별히 해쉬알고리즘을 이용한 MAC을 HMAC이라고 부른다. HMAC은 매우 자바에서 제공하는 API를 이용하여
매우 쉽게 만들 수 있다.
package myBlog;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.bouncycastle.util.encoders.Base64;
...
//HMAC에 사용할 KEY
String key = "ABCDEFG";
//해쉬할 데이터
String data = "12345678901234567890123456789012345678901234567890";
//키를 세팅하고 MD5 해쉬알고리즘을 이용한 HMAC을 사용할 것임을 정한다.
SecretKeySpec spec = new SecretKeySpec(key.getBytes(), "hmacMd5");
Mac mac = Mac.getInstance("hmacMd5");
mac.init(spec);
byte[] res =mac.doFinal(data.getBytes());
System.out.println(res.length);
System.out.println(new String(Base64.encode(res)));
HMAC은 기본적으로 해쉬알고리즘을 사용하기 때문에 결과의 길이는 MD5의 결과값 즉 16바이트가 출력된다.
이를 OPENJCE API로 구현하면 다음과 같다.
import org.bouncycastle.crypto.digests.MD5Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
...
HMac hmac = new HMac(new MD5Digest());
byte[] res2 =new byte[new MD5Digest().getDigestSize()];
hmac.init(new KeyParameter(key.getBytes()));
hmac.update(data.getBytes(), 0, data.getBytes().length);
hmac.doFinal(res2,0);
System.out.println(new String(Base64.encode(res2)));
스크랩:
http://blog.paran.com/blog/detail/postBoard.kth?blogDataId=27934278&pmcId=javacipher&totalCount=13&preViewPage=0&ajaxPage=1&preFBlogId=35385570&preLBlogId=27788506&pageStyle=null&myCateId=0&yearMonth=null&rDay=null&style=Board&p_eye=