HMAC이 뭔가?


발생일: 2013.05.14

문제:
개인 프로젝트에서 서버를 담당하고 있는데, 앱 개발자분이 HMAC을 적용하자고 한다.


HMAC은 Hash-based Message Authentication Code의 약자이다.
우리 말로 하면 '해시 기반 메세지 인증 코드' 정도.
여기서 의미하는 '해시 기반'이라는 게 뭘 의미하는 걸까.



덧) 지금은 `메시지 기반 인증 코드`라는 개념이 쉽게 이해되는데,

처음 이 용어를 들었던 때엔 잘 이해되지 않았던 것 같다.
메모해둔 내용이 꽤나 장황하지만, 그래도 누군가에겐 도움이 될 것 같아 옮겨둔다.


해결책:


Hashing
  키에서 주소로의 변환(key-to-address transformation).
  다른 검색 방법처럼 키값을 비교하면서 찾는 것이 아니라, 키값에 어떤 연산을 시행하여 이 키값이 있는 기억 장소의 주소로 바로 접근하는 방법으로 직접 파일 구성에 이용된다.
  해싱은 각 레코드의 키값을 비교해서 찾는 번고루임이 없고, 다른 검색 방법보다 많은 기억 장소를 차지하지만 과잉 상태가 발생하지 않으면 원하는 레코드를 단 한 번의 접근으로 찾을 수 있는 장점이 있다. 그러나 모든 레코드의 키값을 수치 형태로 바꾸어야 하며, 적절한 해싱 함수를 구해야 할 뿐만 아니라 계산된 주소의 중보(충돌) 문제를 해결해야 한다.

참고:


Hash algorithm
  하나의 문자열을 보다 빨리 찾을 수 있도록 주소에 직접 접근할 수 있는 짧은 길이의 값이나 키로 변환하는 알고리듬.
  해시 알고리듬을 함수로 표현한 것이 해시 함수이다.
  (by 네이버 지식사전 http://terms.naver.com/entry.nhn?docId=858144)


Hash Function
  하나의 문자열을 보다 빨리 찾을 수 있도록 주소에 직접 접근할 수 있는 짧은 길이의 값이나 키로 변환하는 알고리듬을 수식으로 표현한 것.
  즉, 해싱 함수 h(k)는 어떤 키 k에 대한 테이블 주소를 계산하기 위한 방법으로 주어진 키 값으로부터 레코드가 저장되어 있는 주소를 산출해 낼 수 있는 수식을 말한다.
  문자열을 찾을 때 문자를 하나하나 비교하며 찾는 것보다 문자열에서 해시 키를 계산하고 그 키에 해당하는 장소에 문자열을 저장해 둔다면,
  찾을 때는 한 번의 해시키 계산만으로도 쉽게 찾을 수 있게 된다.
 
  해시 함수 또는 해시 알고리즘은 임의의 데이터로부터 일종의 짧은 '전자 지문'을 만들어 내는 방법이다.
  해시 함수는 데이터를 자르고 치환하거나 위치를 바꾸는 등의 방법을 사용해 결과를 만들어 내며,
  이 결과를 흔히 해시 값(hash value)라 한다. 해시 함수는 결정론적으로 작동해야 하며, 따라서 두 해시 값이 다르다면 그 해시 값에 대한 원래 데이터도 달라야 한다.
  (이에 대한 역은 성립하지 않는다.)
  해시 함수의 질은 모든 입력 대상에 대해 얼마나 적은 해시 충돌(서로 다른 두 데이터의 해시 값이 같은 경우)를 일으키느냐로 결정되는데, 충돌이 많이 날 수록 서로 다른 데이터를 구별하기 어려워지고 데이터를 검색하는 비용이 늘기 때문이다.
  (위키 백과: http://ko.wikipedia.org/wiki/%ED%95%B4%EC%8B%9C_%ED%95%A8%EC%88%98)


  문자열을 고정 길이로 압축하는 메서드.
  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

  (구글링한 MIT의 PT: http://goo.gl/ZfPXv)



  해시 함수의 일종으로, 해시 값으로부터 원래의 입력 값과의 관계를 찾기 어려운 성질을 가지는 경우를 의미한다.
  임의의 문자열을 고정 길이로 리턴한다.
  인코딩 할 메세지 = message, 인코딩 된 결과 = digest
  이상적인 암호화 해시 펑션의 특징:
    - 어떤 메세지든 해시 값을 계산하기 쉬워야 한다.
    - 해시 값으로 메세지를 복원할 수 없어야 한다.
    - 해시를 변경해서 메세지가 변경되면 안된다.
    - 한 개의 해시를 만드는 방법은 오직 한 가지 뿐이어야 한다.


  메세지를 아주 작게만 변경해도 결과 값은 완전히 달라진다. (so-called avalanche effect)


  메세지 인증 코드(이하 MAC)


Hash-based message authentication code : http://en.wikipedia.org/wiki/HMAC
해시 기반 메세지 인증 코드
  설명 참조: http://goo.gl/fQ6x9



카테고리

분류 전체보기 (702)
About me. (6)
Daylogs (667)
비공개 (0)
영어공부 (0)
My works - 추억 (29)