ウェブフックのシグネチャを確認する

概要 #

Wooshpay が webhook エンドポイントに送信するイベントを確認します。

Wooshpay署名ヘッダー #

について ウーシュペイ-署名 各署名付きイベントに含まれるヘッダーには、タイムスタンプと署名が含まれる。

タイムスタンプの先頭には t=各シグネチャの先頭には v1.

例えば、こうだ:

Wooshpay-Signature:t=1492774577,v1=6fdfb9c357542b8ee07277f5fca2c6f728bae2dce9be2f91412f4de922c1bae4

ウェブフック秘密鍵 #

Wooshpayはユニークな 秘密鍵 各ウェブフックについて whsec_

署名を検証する前に、Webhook シークレットを ウェブフック を webhook オブジェクトに追加します。

ウェブフック秘密鍵

署名の検証 #

を比較する。 ヘッダーに署名 に対する 期待される署名第三者によってではなく、Wooshpayによって送信されたことを確認することができます。

ステップバイステップで署名を確認するには、以下のガイドに従ってください:

ステップ1:ヘッダーからタイムスタンプと署名を抽出する #

ヘッダーを分割するには , 文字を区切り文字として、要素のリストを取得する。次に、各要素を = 文字を区切り文字として、接頭辞と値のペアを取得します。

プレフィックスの値 t はタイムスタンプに対応し v1 はシグネチャーに対応する。それ以外の要素は捨てても構わない。

例えば、こうだ:

t=1687845304,v1=6fdfb9c357542b8ee07277f5fca2c6f728bae2dce9be2f91412f4de922c1bae4

ステップ2:準備 署名入りペイロード ストリング #

について 署名入りペイロード 文字列は連結して作成される:

  • タイムスタンプ(文字列)
  • キャラクター .
  • 実際のJSONペイロード(リクエストボディ)

例えば、こうだ:

1687845304+.+JSONペイロード

1687845304.{
  "id":"evt_1NNUrjL6kclEVx6Mb1x5dKJ3",
  "object":"event": "イベント"、
  "api_version":"2022-11-15",
  "created":1687845303,
  "data":{
    "object":{
      "id":"prod_O9oUVgsSaordCT"、
      "オブジェクト":「product"、
      "active": true、
      "livemode": true、
      「name":「test"、
      「type":「サービス"、
  "livemode": true、
  「pending_webhooks":1,
  「タイプ":"product.created"
}

ステップ3:予想されるシグネチャーの決定 #

SHA256ハッシュ関数でHMACを計算する。

  • エンドポイントのウェブフック・シークレットを キーそれは以下のサイトから入手できる。 ウェブフック ウェブフック・オブジェクト
  • を使用する。 署名入りペイロード 文字列を メッセージ これは、ステップ2ですでに準備したものである。

を通して キー + メッセージであるHMAC文字列を計算することができる。 期待される署名

例えば、こうだ:

 public static void main(String[] args) { 以下のようにします。
        String webhookSecret = "whsec_261V2mfsXt1BsOjJbHaQOxnTzhWZKrUE";
        String timestamp = "1687845304";
        String requestBody = "{\"id\":\"evt_1NNUrjL6kclEVx6Mb1x5dKJ3\",\"object\":\"event\",\"api_version\":\"2022-11-15\",\"created\":1687845303,\"data\":{\"object\":{\"id\":\"prod_O9oUVgsSaordCT\",\"object\":\"product\",\"active\":true,\"livemode\":true,\"name\":\"test\",\"type\":\"service\",\"livemode\":true,\"pending_webhooks\":1,\"type\":\"product.created"}";
        String signedPayload = timestamp+". "+requestBody;
        String signature = hmacSha256(webhookSecret,signedPayload);
        String WooshpaySignature = "t="+timestamp+",v1="+signature;
    }

    /**
     * HMAC-SHA256
     */
    public static String hmacSha256(String secret, String message) { 以下のようにします。
        文字列 res;
        try {
            Mac mac = Mac.getInstance("HmacSHA256");
            SecretKey secretKey = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
            mac.init(secretKey);
            byte[] hash = mac.doFinal(message.getBytes());
            res = Hex.encodeHexString(hash);
        } catch (例外e) {
            return null;
        }
        return res;
    }

ステップ4:署名を比較する #

を比較する。 ヘッダーに署名 に対する 期待される署名.

等号一致の場合は、以下の差分を計算する。 現在のタイムスタンプ そして 受信タイムスタンプそして、その差が自分の許容範囲内かどうかを判断する。

タイミング攻撃から保護するために、予想されるシグネチャと受信したシグネチャのそれぞれを比較するために、定時文字列比較を使用することができる。

どのようなお気持ちですか?
2023年8月5日更新