HMAC-SHA256を利用したWebhookメッセージの検証方法
Webhookとは?
WebhookとはWEBシステムで特定のイベントが発生した際に外部システムへHTTPでリアルタイムに通知する仕組みのことを指します。
事前に通知するタイミングや通知の内容、通知の宛先を指定しておくことで、他システム連携が可能になります。
例えば、申請データのステータスが完了になった時に他システムにその情報を連携する、といった使い方ができます。
とても便利な仕組みですが、受信側としてはメッセージが改ざんされていないかどうかは重要なポイントですね。
今回は外部システムから送られてきたWebhookメッセージが改ざんされていないか検証する方法をご紹介したいと思います。
サンプルスクリプト
今回はServiceNowのScripted REST APIs宛てに送信されたDocuSign Connectからのメッセージを扱います。
DocuSign Connectからのリクエストのヘッダーには秘密鍵でハッシュされたメッセージ本文が含まれています。
下記ではDocuSignの秘密鍵とリクエスト本文を使ってハッシュ値を生成し、リクエストヘッダーに同じ値が含まれているかを検証します。
(function process(/*RESTAPIRequest*/ request, /*RESTAPIResponse*/ response) { // 送信側システムから受信したbodyとheaderをJS形式に変換 var bodyAll =JSON.stringify(request.body.data); var Headers =JSON.stringify(request.headers); //秘密鍵と取得したbodyを使用してハッシュ値を作成する。 var mac = new GlideCertificateEncryption; var key = "送信側システムで作成した秘密鍵"; key = GlideStringUtil.base64Encode(key); //base64に変換されている場合はここは不要 var payload= bodyAll; var h = mac.generateMac(key, "HmacSHA256", payload); if (Headers.indexOf(h) !== -1) { //実行する処理 } })(request, response);
上記の処理で作成したハッシュ値がリクエストヘッダーに含まれていたら
・DocuSign Connectから送信されたメッセージである
・メッセージは改ざんされていない
ということがわかります。