Language/Java

HMAC[Hash-based Message Authentication Code]

아르비스 2014. 10. 7. 08:34

제목 그대로 HMAC[Hash-based Message Authentication Code]의 code

 


 문자열을 고정 길이로 압축하는 메서드.
  H: {0,1}* -> {0,1}^160

  input = "message", output = "digest"

왜 쓰냐면?
  1) 짧고, 고정 길이이다. 2) 중복을 방지할 수 있다. 3) 메세지 구조를 숨길 수 있다.

  뭐가 좋은가?
  충돌 저항 해시 함수(collision resistant hash function)은 작고 고정된 사이즈의 해시 값을 만들어 내기 때문에,
  크고 긴 메세지의 프록시처럼 행동할 수 있다.
  RSA나 DSA 같은 디지털 서명 알고리즘(digital signature algorithm)이나 메세지 인증 코드, 가상 랜덤 발생기, 키 기반 함수에 활용될 수 있다.

  특징
  - 같은 해시 값을 생성하는 두 개의 입력값을 찾는 것이 거의 계산상 불가능하다. --> 충돌 저항성(Collision resistance)
  - 해시 값으로 메세지를 추측하기 불가능하다. --> 일방향 함수(One-way)
  - 두 개의 값으로 변경하는 경우, 나머지 하나를 알더라도 해시 값을 추측할 수 없다. --> Unpredictability
  - 메세지의 길이가 달라도 고정 길이를 리턴한다. --> Extraction


example Code (java)

public class Signature {

private static final Logger logger = LoggerFactory.getLogger(Signature.class);

private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";

public static String doHMAC(String data, String key) {

String result = null;

// get an hmac_sha1 key from the raw key bytes

SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM);


// get an hmac_sha1 Mac instance and initialize with the signing key

Mac mac;

try {

mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);

mac.init(signingKey);


// compute the hmac on input data bytes

byte[] rawHmac = mac.doFinal(data.getBytes());

// base64-encode the hmac

result = encodeBase64(rawHmac);

} catch (NoSuchAlgorithmException e) {

logger.error("NoSuchAlgorithmException ", e);

} catch (InvalidKeyException e) {

logger.error("InvalidKeyException ",e);

}

return result;

}


/**

* @author Juseok

* @see Signature.encodeBase64

* @description :

* @param rawHmac

* @return

*/

public static String encodeBase64(byte[] rawData) {

String result;

byte[] resultArray = Base64.encodeBase64(rawData);

result = new String(resultArray);

return result;

}

}