HMAC-SHA256認証

HMAC-SHA256によるメッセージ認証の仕組みを解説。鍵付きハッシュ構造、API署名の用途、実装のベストプラクティスを学びます。

HMAC

詳細な説明

HMAC-SHA256(Hash-based Message Authentication Code with SHA-256)は、秘密鍵とSHA-256ハッシュ関数を組み合わせて認証タグを生成する構造です。データの整合性と真正性の両方を検証し、データが改ざんされていないこと、秘密鍵を持つ者から送信されたことを確認します。

HMACの仕組み:

HMACはRFC 2104で定義された2パスハッシュスキームを使用します。秘密鍵KとメッセージMに対し、計算はHMAC(K, M) = SHA-256((K' XOR opad) || SHA-256((K' XOR ipad) || M))です。K'はブロックサイズ(SHA-256の場合512ビット)にパディングされた鍵、ipadは0x36の繰り返し、opadは0x5cの繰り返しです。

なぜ単純な鍵+メッセージのハッシュではだめなのか:

SHA-256(key + message)のような素朴なアプローチは長さ伸長攻撃に脆弱です。SHA-256はMerkle-Damgard構造を使用するため、SHA-256(key + message)を知る攻撃者は鍵を知らずにSHA-256(key + message + padding + extension)を計算できます。HMACのネストされたハッシュ構造はこの脆弱性を完全に排除します。

一般的な用途:

HMAC-SHA256はAPI認証で広く使用されています。AWS Signature Version 4はHMAC-SHA256でAPIリクエストに署名します。JWT(JSON Web Token)はHS256(HMAC-SHA256)をトークン署名に一般的に使用します。Webhook検証システム(GitHub、Stripe、Slack)はHMAC-SHA256でペイロードを認証します。

実装ガイダンス:

HMACには標準暗号ライブラリを使用してください(Node.jsのcrypto.createHmac、Pythonのhmacモジュール、Javaのjavax.crypto.Macなど)。自前でHMACを実装しないでください。HMACタグの検証にはタイミング攻撃を防ぐため定数時間比較を使用してください。鍵は256ビット(32バイト)以上の暗号学的乱数データにしてください。

ユースケース

HMAC-SHA256は、APIリクエストの署名(AWS、Stripe、GitHub Webhook)やHS256アルゴリズムによるJWTトークン生成の標準メカニズムです。

Try It — Hash Generator

フルツールを開く