0Pricing
Cryptology Academy · レッスン

APIにおけるHMAC:リクエスト署名

HMACベースのリクエスト署名とリプレイ攻撃対策を実装します。

「APIにおけるHMAC:リクエスト署名」はCoddyKit上の無料Cryptology Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCryptology Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cryptology Academyコースには全4レッスンが含まれています。

ようこそ

HMACベースのリクエスト署名は、AWS、GitHub、Stripe、TwilioでAPI呼び出しの認証に使用されています。このレッスンでは、完全なリクエスト署名システムを構築します。

APIリクエストに署名する理由

URLに含めたAPIキーは、プロキシサーバー、ブラウザー履歴、サーバーログに記録される可能性があります。リクエスト署名ではリクエスト本文全体をMACに含めるため、ペイロードが変更されていないことを保証し、鍵だけが単独で漏えいするのを防ぎます。

AWS Signature Version 4

AWS SigV4では次の値を計算します: 1. 正規化リクエスト(メソッド + URL + ヘッダー + 本文のハッシュ) 2. 署名対象文字列(日付 + リージョン + サービス + 正規化リクエストのハッシュ) 3. 署名鍵 = HMAC(HMAC(HMAC(HMAC('AWS4'+secret, date), region), service), 'aws4_request') 4. 署名 = HMAC(signing_key, string_to_sign)

GitHub Webhookの検証

GitHubは各Webhookペイロードに署名します: X-Hub-Signature-256: sha256=HMACHEX 検証します: import hmac expected = 'sha256=' + hmac.new(secret, payload, 'sha256').hexdigest() hmac.compare_digest(expected, received_signature)

リプレイ攻撃の脅威

攻撃者が有効な署名付きリクエストを取得すると、そのリクエストを何度も再送できます。1回だけ署名された100ドルの送金が、1000回リプレイされる可能性があります。HMACだけではリプレイ攻撃を防げません。

タイムスタンプによるリプレイ防止

署名対象のメッセージにタイムスタンプを含めます。5分より古いリクエストは拒否します。Stripeはタイムスタンプを含むX-Stripe-Signatureを送信します。GitHubはタイムスタンプ方式ではなく、X-GitHub-Delivery(UUID)を使用します。

ノンスによるリプレイ防止

各リクエストにランダムなノンスを含めます。サーバーは使用済みノンスを(TTL付きのRedisなどに)保存します。以前に確認したノンスを含むリクエストは拒否します。分散システムでは、タイムスタンプより信頼性が高くなります。

リクエスト署名の実装

import hmac, hashlib, time, os def sign_request(secret, method, path, body, timestamp=None): ts = timestamp or str(int(time.time())) payload = f'{method}\n{path}\n{ts}\n' + hashlib.sha256(body).hexdigest() sig = hmac.new(secret.encode(), payload.encode(), 'sha256').hexdigest() return ts, sig

サーバー側での検証

def verify_request(secret, method, path, body, ts, received_sig): # Check timestamp freshness if abs(time.time() - int(ts)) > 300: # 5 minutes return False # Recompute and compare _, expected = sign_request(secret, method, path, body, ts) return hmac.compare_digest(expected, received_sig)

HMACを使用したJWT(HS256)

HS256 JWTは、共有秘密鍵を使用するHMAC-SHA256で署名します。サーバーは署名と検証の両方を行います。制限として、鍵を持つすべての当事者がトークンを偽造できます。非対称の信頼モデル(第三者認証)には、RS256またはES256を使用します。

鍵ローテーション戦略

HMAC鍵は定期的にローテーションします。新しい鍵を生成し、移行期間(24時間)は古い鍵と新しい鍵の両方をサポートし、その後に古い鍵を廃止します。AWS SigV4は日付付きの秘密情報から鍵を導出し、毎日のローテーションを可能にします。

確認問題

リプレイ攻撃を防ぐには、HMACによるリクエスト署名だけでは不十分なのはなぜですか?

まとめ

リプレイ防止機能を備えたHMACリクエスト署名を実装しました。次は、ブロック暗号ベースのMACの代替方式としてCMACとPoly1305を比較します。

よくある質問

「APIにおけるHMAC:リクエスト署名」レッスンは無料ですか?

はい。「APIにおけるHMAC:リクエスト署名」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cryptology Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cryptology Academyコースには全4レッスンが含まれています。

「APIにおけるHMAC:リクエスト署名」で何を学びますか?

HMACベースのリクエスト署名とリプレイ攻撃対策を実装します。 ブラウザで直接実行するハンズオンコードでCryptology Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Cryptology Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのCryptology Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「APIにおけるHMAC:リクエスト署名」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このCryptology Academyレッスンでコードを書いて実行できますか?

はい。すべてのCryptology Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. MACの概念と長さ拡張攻撃
  2. HMACの構成と安全性証明
  3. APIにおけるHMAC:リクエスト署名
  4. CMACとPoly1305:ブロック暗号MAC
← Cryptology Academyに戻る