メインコンテンツへスキップ
Diditが750万ドルを調達、本人確認と不正対策のインフラを構築
Didit
ブログ一覧へ
ブログ2026年3月6日

Node.jsバックエンドを保護する:Didit WebhookのHMAC検証 (JA)

データの一貫性を保ち、不正アクセスを防ぐには、ウェブフックに堅牢なセキュリティ対策を実装することが不可欠です。このガイドでは、Node.jsにおけるDiditウェブフックのHMAC署名検証に焦点を当てています。.

By Didit更新日
secure-your-nodejs-backend-hmac-validation-for-didit-webhooks.png

データ整合性を保護するHMAC署名検証は、ウェブフックペイロードの信頼性と整合性を検証するために不可欠であり、改ざんされたリクエストや不正なリクエストからバックエンドを保護します。

リプレイ攻撃を防ぐタイムスタンプ検証は、HMAC署名と組み合わせることで、リプレイ攻撃に対する重要な防衛層を追加し、最新の通知のみが処理されるようにします。

シームレスな統合Diditの開発者第一のアプローチは、明確なドキュメントとツールを提供し、セキュアなウェブフック処理をNode.jsアプリケーションに簡単かつ効率的に統合できるようにします。

DiditのセキュアなインフラストラクチャDiditのプラットフォームはセキュリティを考慮して構築されており、堅牢なHMAC署名検証を伴うウェブフックを介したリアルタイムのKYC通知を提供し、信頼できる準拠したIDソリューションを構築できるようにします。

ウェブフックセキュリティの決定的な必要性

ウェブフックは、サービス間のリアルタイム通信のための強力なツールであり、即座の更新とイベント駆動型アーキテクチャを可能にします。本人確認のコンテキストでは、Diditはウェブフックを使用して、検証セッションの完了、AMLスクリーニング結果、またはその他の重要な本人確認関連イベントについてバックエンドに通知します。非常に効率的である一方で、ウェブフックはセキュリティ上の課題も引き起こします。適切な検証がなければ、悪意のあるアクターが偽造または改ざんされたウェブフックペイロードを送信し、データの誤処理、不正なアクション、さらにはシステム侵害につながる可能性があります。

ここで、HMAC(Hash-based Message Authentication Code)署名検証が不可欠になります。HMACは、メッセージの信頼性と整合性の両方を検証するための暗号メカニズムを提供します。共有秘密鍵を使用することで、バックエンドはウェブフックペイロードがDiditから発信され、転送中に改ざんされていないことを確認できます。DiditのID検証、AMLスクリーニング、または住所証明サービスによって処理されるような機密性の高いIDデータを扱うシステムにとって、このレベルのセキュリティは単なるベストプラクティスではなく、必要不可欠です。

HMAC署名検証の理解

HMAC検証は、Diditとあなたのアプリケーションのみが知っている秘密鍵を使用して、各ウェブフックペイロードに対して一意の署名を生成することで機能します。Node.jsバックエンドがウェブフックを受信すると、秘密鍵のコピーを使用して同じ署名計算を実行します。計算された署名がウェブフックのヘッダーで提供された署名と一致する場合、ペイロードが本物であり、改ざんされていないことを確信できます。

Diditのウェブフックには、HMAC-SHA256署名を含むX-Signatureヘッダーと、X-Timestampヘッダーが含まれています。タイムスタンプは、リプレイ攻撃を防ぐために重要です。リプレイ攻撃は、攻撃者が正当なウェブフックを傍受し、後でそれを再送信するときに発生します。タイムスタンプが新しい(例:5分以内)ことを検証することで、古い、潜在的にリプレイされたリクエストを破棄できます。

Node.jsでのHMAC検証の実装

Node.js ExpressアプリケーションでDiditウェブフックのHMAC署名検証を実装する手順を見ていきましょう。Diditビジネスコンソールで見つけるか、管理APIを介して取得できるウェブフックの秘密鍵にアクセスする必要があります。

1. ウェブフックエンドポイントの設定

まず、POSTリクエストを受信できるExpressエンドポイントを設定します。署名は生のペイロードに対して計算されるため、JSON解析ミドルウェアの前に生の要求ボディにアクセスすることが重要です。


const express = require('express');
const crypto = require('crypto');
const bodyParser = require('body-parser');

const app = express();
const DIDIT_WEBHOOK_SECRET = process.env.DIDIT_WEBHOOK_SECRET; // Store securely!

// Middleware to get raw body
app.use(bodyParser.json({ verify: (req, res, buf) => {
  req.rawBody = buf.toString();
}}));

app.post('/api/webhooks/didit', (req, res) => {
  // Webhook processing logic will go here
  res.status(200).send('Webhook received');
});

app.listen(3000, () => console.log('Server running on port 3000'));

2. HMAC署名の検証

ウェブフックハンドラ内で、ヘッダーからタイムスタンプと署名を抽出し、署名されたペイロードを再構築し、計算された署名をDiditによって提供されたものと比較します。


app.post('/api/webhooks/didit', (req, res) => {
  const signatureHeader = req.headers['x-signature'];
  const timestampHeader = req.headers['x-timestamp'];
  const rawBody = req.rawBody;

  if (!signatureHeader || !timestampHeader || !rawBody) {
    return res.status(400).send('Missing webhook headers or body.');
  }

  const [algorithm, diditSignature] = signatureHeader.split('=');

  if (algorithm !== 'sha256') {
    return res.status(400).send('Unsupported signature algorithm.');
  }

  // Reconstruct the signed payload string
  const signedPayload = `${timestampHeader}.${rawBody}`;

  // Calculate your own signature
  const expectedSignature = crypto
    .createHmac('sha256', DIDIT_WEBHOOK_SECRET)
    .update(signedPayload)
    .digest('hex');

  // Compare signatures securely
  const signatureMatches = crypto.timingSafeEqual(
    Buffer.from(diditSignature, 'utf8'),
    Buffer.from(expectedSignature, 'utf8')
  );

  if (!signatureMatches) {
    console.warn('Webhook signature mismatch!');
    return res.status(401).send('Invalid signature.');
  }

  // Signature is valid, now check timestamp
  // ... (timestamp validation in next step)

  // Process event
  console.log('Webhook validated successfully:', req.body);
  res.status(200).send('Webhook received and processed.');
});

3. タイムスタンプの検証

署名を検証した後、ウェブフックがリプレイでないことを確認します。一般的な方法は、ネットワーク遅延のために小さな許容範囲(例:5分)を設けることです。


// ... (inside the webhook handler, after signature validation)

  const fiveMinutesAgo = Date.now() / 1000 - (5 * 60); // 5 minutes in seconds
  const eventTimestamp = parseInt(timestampHeader, 10);

  if (isNaN(eventTimestamp) || eventTimestamp < fiveMinutesAgo) {
    console.warn('Webhook timestamp too old or invalid!');
    return res.status(401).send('Invalid or old timestamp.');
  }

  // Now you can safely parse and process the JSON body
  try {
    const event = JSON.parse(rawBody);
    console.log('Processed Didit event:', event);
    // Example: Update user status based on event.database_validation.status

    // Didit's Database Validation Report structure:
    // const validationStatus = event.database_validation.status;
    // const matchType = event.database_validation.match_type;
    // console.log(`Validation Status: ${validationStatus}, Match Type: ${matchType}`);

    res.status(200).send('Webhook received and processed.');
  } catch (error) {
    console.error('Error parsing webhook body:', error);
    res.status(400).send('Invalid JSON body.');
  }
});

ウェブフック処理のベストプラクティス

  • シークレットを安全に保管する: ウェブフックの秘密鍵をハードコードしないでください。環境変数または安全なシークレット管理サービスを使用してください。
  • 冪等性: ウェブフックハンドラを冪等性を持つように設計してください。これは、同じウェブフックを複数回処理しても(例えば、再試行のため)、1回処理するのと同じ効果があることを意味します。
  • 非同期処理: 時間のかかるタスクの場合、200 OK応答でウェブフックをすぐに確認し、メッセージキューを使用してペイロードを非同期で処理します。これにより、タイムアウトを防ぎ、Diditがウェブフックを再試行し続けるのを防ぎます。
  • ログと監視: 検証失敗を含む、受信したすべてのウェブフックに対して堅牢なログを実装します。異常なアクティビティや高いエラー率がないか、ウェブフックエンドポイントを監視します。
  • エラー処理: Diditが再試行が必要かどうかを理解できるように、適切なHTTPステータスコード(例:不正なリクエストの場合は400、不正な場合は401、サーバーエラーの場合は500)を返します。

Diditがどのように役立つか

Diditは、AIネイティブで開発者第一の本人確認プラットフォームとして設計されており、ウェブフック処理のようなセキュアな統合を簡単かつ信頼性の高いものにします。当社のモジュラーアーキテクチャにより、ID検証、パッシブ&アクティブライブネス、AMLスクリーニング&監視などの本人確認チェックを簡単に組み込むことができ、セキュアなウェブフックを介してリアルタイムの更新を受け取ることができます。Diditは、ウェブフックを統合するための明確なドキュメントと例を提供し、堅牢で安全な通信チャネルを迅速に設定できるようにします。

私たちは、本人確認をアクセスしやすく強力なものにすることを目指しています。そのため、無料のコアKYC、成功したチェックごとの支払いモデル、およびセットアップ料金は一切かかりません。Diditのプラットフォームを活用することで、信頼を自動化し、リスクを調整するグローバルでスケーラブルなソリューションにアクセスできます。これらすべてを、リアルタイム通知のHMAC署名検証を含む最高のセキュリティ基準を維持しながら実現します。

開始する準備はできましたか?

Diditの動作をご覧になりたいですか? 今すぐ無料デモを入手してください。

Diditの無料ティアで無料で本人確認を開始してください。

本人確認と不正対策のインフラ。

KYC、KYB、取引監視、ウォレットスクリーニングを一つのAPIで。5分で統合できます。

AIにこのページの要約を依頼する
Node.jsバックエンドの保護:Didit WebhookのHMAC検証.