メインコンテンツまでスキップ

2. HMAC の定義 (Definition of HMAC)

HMAC の定義には、暗号学的ハッシュ関数 (H と記す) と秘密鍵 K が必要である。ここで H は、データをデータブロック上で基本圧縮関数を反復することによってハッシュする暗号学的ハッシュ関数であると仮定する。このようなブロックのバイト長を B と記す (上記のハッシュ関数の例すべてについて B=64)、またハッシュ出力のバイト長を L と記す (MD5 では L=16、SHA-1 では L=20)。認証鍵 K は、ハッシュ関数のブロック長である B までの任意の長さをとり得る。B バイトより長い鍵を用いるアプリケーションは、まず H を用いて鍵をハッシュし、その結果となる L バイトの文字列を HMAC の実際の鍵として用いる。いずれの場合も、K の最小推奨長は L バイト (ハッシュ出力長) である。鍵の詳細については第 3 節を参照。

2 つの固定された異なる文字列 ipad および opad を、以下のように定義する ('i' および 'o' は inner (内側) および outer (外側) の助記記号である):

ipad = the byte 0x36 repeated B times
opad = the byte 0x5C repeated B times

データ text に対する HMAC を計算するためには、以下を実行する。

H(K XOR opad, H(K XOR ipad, text))

すなわち、

  1. K の末尾にゼロを付加して B バイトの文字列を作成する (例: K の長さが 20 バイトで B=64 の場合、K には 44 バイトのゼロ 0x00 が付加される)
  2. ステップ (1) で計算した B バイト文字列と ipad との XOR (ビットごとの排他的論理和) をとる
  3. ステップ (2) で得られた B バイト文字列にデータストリーム 'text' を付加する
  4. ステップ (3) で生成されたストリームに H を適用する
  5. ステップ (1) で計算した B バイト文字列と opad との XOR (ビットごとの排他的論理和) をとる
  6. ステップ (4) の H の結果を、ステップ (5) で得られた B バイト文字列に付加する
  7. ステップ (6) で生成されたストリームに H を適用し、その結果を出力する

参考までに、MD5 に基づくサンプルコードを付録として提供する。