Webhookのセキュリティ:HMAC署名

Webhookのセキュリティ:HMAC署名

お知らせ:当社は、お客様により充実したサポート情報を迅速に提供するため、本ページのコンテンツは機械翻訳を用いて日本語に翻訳しています。正確かつ最新のサポート情報をご覧いただくには、本内容の英語版を参照してください。

プロジェクト、タスク、課題の Webhook を HMAC-SHA 256(SHA 256 を使用したハッシュベースメッセージ認証コード)で保護できます。Zoho プロジェクトでは、Webhook の真正性と完全性を確保・維持するための業界標準のハッシュ方式である HMAC-SHA 256 を使用して Webhook を保護することができます。

HMAC では次の点を確認できます:
  1. Webhook リクエストが Zoho プロジェクトから送信されたものかどうか(シークレットキーは Zoho プロジェクトと受信アプリケーションのみが知っている必要があります)。
  2. Webhook の内容が送信途中で改ざんされていないかどうか。

Webhook を保護する理由

Webhook は、あるアプリケーションから別のアプリケーションにリアルタイムデータを提供するための HTTP リクエストです。セキュリティ攻撃では、攻撃者が不正な Webhook を送信して正規のプロバイダーになりすまし、機密データを取得することが容易にできます。そのため、アプリが信頼できる送信元からの正規の処理のみを受信し、偽のリクエストや悪意のあるリクエストにだまされないよう、Webhook を保護する必要があります。

メリット:

  1. レポートへの誤ったデータの反映を防止
  2. 不正な更新を防止
  3. セキュリティ侵害を防止

Webhook セキュリティを有効にする

ユーザーは、Webhook の追加時または編集時に Webhook セキュリティ設定を有効にできます。
  1. [設定]>[自動化 / Issue Tracker]>[Webhook]に移動します。
  2. 新規 Webhook の場合は、Webhook フォームに詳細を入力し、[セキュリティ設定]をオンに切り替えます。既存の Webhook の場合は、セキュリティを有効にする Webhook を選択します。
  3. HMAC キーを入力します。[生成]をクリックして HMAC キーを生成することもできます。
  4. [保存]をクリックします。
Notes
HMAC キーの長さは 16~128 文字である必要があります。

Zoho プロジェクトでの Webhook セキュリティの仕組み

Zoho プロジェクトから Webhook が送信されると、X-ZP-Webhook-署名 という名前の HMAC 署名がリクエストヘッダーに含まれます。Webhook リクエストを受信したアプリケーションは、同じシークレットキーを使用して HMAC 署名を生成し、リクエストヘッダーに含まれる値と比較します。値が一致する場合はデータは正当であり、一致しない場合はデータが改ざんされています。

HMAC 署名の生成

Zoho プロジェクトは、HMAC-SHA256 アルゴリズムを使用して Webhook データの内容の署名を計算し、その結果を base64 形式でリクエストヘッダーに送信します。以下はサンプルデータを用いた説明です。

データの内容
{{'requests':{'request_name':'テスト 名前'},'通知': {'operation_type':'RequestSigningSuccess'}}
secret_key
  thisisthesamplekeyfortestingpurposes
base64encode(HMAC SHA-256(データの内容+secret_key))
drbSrM4H816RYKpZiRBLddUa0yHaTrwjtY04sIZFZus=

Webhook リクエストヘッダー(HMAC ヘッダー)がどのように表示されるかのイメージは次のとおりです。

受信アプリケーションでの HMAC 署名の検証

  1. JSON 形式で読み込む際にキーの順序が変わらないよう、データの内容は文字列として読み取る必要があります。
  2. シークレットキーを使用してデータの内容の HMAC SHA-256 ハッシュを計算し、その結果を base64 エンコードします。
  3. 手順 2 で取得した値と、受信した HMAC ヘッダー(X-ZP-Webhook-署名)の値を比較します。一致しない場合は、その Webhook リクエストを却下します。

HMAC 署名を認証するための Java コードスニペットのサンプル: