HMAC

testwiki
둘러보기로 이동 검색으로 이동

틀:위키데이터 속성 추적

HMAC-SHA1 생성

암호학에서 HMAC(keyed-hash message authentication code, hash-based message authentication code)는 암호화 해시 함수와 기밀 암호화 키를 수반하는 특정한 유형의 메시지 인증 코드(MAC)이다. 여느 MAC처럼 메시지의 데이터 무결성과 진본 확인을 동시에 수행하기 위해 사용할 수 있다.

상세 설명

SHA-2, SHA-3 등의 암호화 해시 함수는 HMAC 연산을 위해 사용할 수 있다. 그 결과가 되는 MAC 알고리즘은 HMAC-X이며 여기서 X는 사용이 되는 해시 함수(예: HMAC-SHA256 또는 HMAC-SHA3-256)를 의미한다. HMAC의 암호화 등급은 그 기반이 되는 해시 함수의 암호화 등급, 해시 출력의 크기, 키의 크기와 품질에 따라 달라진다.

HMAC는 메시지를 암호화하지 않는다. 그 대신, 메시지의 암호화 여부에 관계 없이 메시지는 HMAC 해시와 함께 송신되어야 한다. 기밀 키를 가진 쌍방은 스스로가 다시 메시지를 해싱하게 되며 진본인 경우 수신 후 연산되는 해시가 일치하게 된다.

HMAC 구성의 정의와 분석은 1996년 Mihir Bellare, Ran Canetti, and Hugo Krawczyk의 논문에 처음 출간되었으며[1] 이들은 1997년 RFC 2104를 작성하기도 했다. 또, 1996년 논문은 NMAC라는 내포형(nested) 변종을 정의하였다. FIPS PUB 198은 HMAC의 이용을 일반화하고 표준화한다. HMAC는 IPsec, SSH, TLS 프로토콜, 그리고 JSON 웹 토큰에 사용된다.

정의

이 정의는 RFC 2104에서 발췌한 것이다:

HMAC(K,m)=H((Kopad)H((Kipad)m))K={H(K)K is larger than block sizeKotherwise

여기서

H는 암호화 해시 함수이다
m은 인증 대상 메시지이다
K는 기밀 키이다
K틀:'는 기밀 키 K에서 파생된 블록 크기 키이다
||는 문자열 연결을 의미한다
⊕는 비트 배타적 논리합(XOR)을 의미한다
opad는 블록 크기의 외부 패딩으로서, 반복되는 0x5c 값 바이트로 구성된다
틀:Sic는 블록 크기의 내부 패딩으로서 반복되는 0x36 값 바이트로 구성된다

구현

다음 의사코드는 HMAC가 어떻게 구현될 수 있는지를 증명한다. 다음 해시 함수 중 하나를 사용할 때 블록크기는 64바이트이다: SHA-1, MD5, RIPEMD-128/160.[2]

틀:Font color hmac 틀:Font color
    틀:Font color
        key:        Bytes    // Array of bytes
        message:    Bytes    // Array of bytes to be hashed
        hash:       Function // The hash function to use (e.g. SHA-1)
        blockSize:  Integer  // The block size of the hash function (e.g. 64 bytes for SHA-1)
        outputSize: Integer  // The output size of the hash function (e.g. 20 bytes for SHA-1)
    // Keys longer than blockSize are shortened by hashing them
    틀:Font color (length(key) > blockSize) 틀:Font color
        key ← hash(key) // key is outputSize bytes long
    // Keys shorter than blockSize are padded to blockSize by padding with zeros on the right
    틀:Font color (length(key) < blockSize) 틀:Font color
        key ← Pad(key, blockSize) // Pad key with zeros to make it blockSize bytes long
    o_key_pad ← key xor [0x5c * blockSize]   // Outer padded key
    i_key_pad ← key xor [0x36 * blockSize]   // Inner padded key
    틀:Font color hash(o_key_pad ∥ hash(i_key_pad ∥ message))

예시

다음은 8비트 ASCII 또는 UTF-8 인코딩 사용을 상정한, 일부 비어있지 않은 HMAC 값이다:

HMAC_MD5("key", "The quick brown fox jumps over the lazy dog")    = 80070713463e7749b90c2dc24911e275
HMAC_SHA1("key", "The quick brown fox jumps over the lazy dog")   = de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9
HMAC_SHA256("key", "The quick brown fox jumps over the lazy dog") = f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8

각주

틀:각주

참고 자료

틀:참고 자료 시작

틀:참고 자료 끝

외부 링크

틀:암호화 해시