MKIが解説するServiceNow開発blog

ServiceNow にまつわるMKIナレッジを紹介いたします。

HMAC-SHA256を利用したWebhookメッセージの検証方法

はじめに

みなさんこんにちは、三井情報株式会社です。


今回は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から送信されたメッセージである
・メッセージは改ざんされていない
ということがわかります。

終わりに

今回はDocuSign Connectから受信したリクエストをもとにご紹介しましたが、別システムからのリクエストの検証にも転用できるのではと思っています。
似たようなケースを検討されている方は上記方法をぜひ試してください。

最後まで読んでいただき、ありがとうございました。


三井情報株式会社
ソリューション技術本部
クラウドソリューション部
第二技術室
佐久間 衣歩

www.mki.co.jp