HMACのアルゴリズム+Pythonで実装

投稿日: 更新日:

HMACの特徴

HMACはハッシュ関数を用いてメッセージ認証コードを生成する手法です。HMACのHはHashのHです。
利用できるハッシュ関数に指定はなく、どんなものでも利用できます。

アルゴリズム

  1. 鍵のサイズを合わせる。 鍵の長さをハッシュ関数のブロック長と同じにします。短ければ後ろを0で埋め、長ければハッシュ値をとります。作業を行ったものをHMACの鍵とします。
  2. (1)で作成した鍵とipadと呼ばれるビット列とのXORを取ります。ipadは2進表記で00110110と示される値をブロック長と同じ長さになるように繰り返したものです。
  3. (2)で計算した値をメッセージの先頭にくっつけます。
  4. (3)のデータのハッシュ値を取ります。
  5. (1)の鍵とopadと呼ばれるビット列とのXORを取ります。opadは2進表記で01011100と示される値をブロック長と同じ長さになるように繰り返したものです。
  6. (5)で計算した値を(4)で計算した値の先頭にくっつけます。
  7. (6)のハッシュ値を計算し完成です!

HMACの手順をまとめた図

Pythonでの実装

注意:これは理解を深めるためのものであり、実際の運用には使用しないでください!

#ハッシュ関数はsha256を使用します
from hashlib import sha256

HASH_BLOCK_BYTE_SIZE = sha256().block_size
IPAD = 0b00110110
OPAD = 0b01011100
key = b"A MAC Key"
message = b"A message"

#--手順1--
#鍵のサイズが大きいとき
if len(key) > HASH_BLOCK_BYTE_SIZE:
    key = sha256(key).digest()

#鍵のサイズが小さいとき
if len(key) < HASH_BLOCK_BYTE_SIZE:
    key += b"\x00" * (HASH_BLOCK_BYTE_SIZE - len(key))

#--手順2--
xor_ipad = bytes()
for i in key:
    xor_ipad += (IPAD ^ i).to_bytes(1, "big")

#--手順3,4--
hash_ipad_message = sha256(xor_ipad + message).digest()

#--手順5--
xor_opad = bytes()
for i in key:
    xor_opad += (OPAD ^ i).to_bytes(1, "big")

#--手順6,7--
hmac = sha256(xor_opad + hash_ipad_message).digest()

print(hmac.hex())

参考文献

結城浩(2015)暗号技術入門 第3版

書いた人

profile_image

お茶の葉

物理とプログラミングが好きな人