Aus dem Englischen übersetzt. Bei Abweichungen gilt die englische Seite. Auf Englisch lesen

Signaturen prüfen

Weise nach, dass ein Webhook wirklich von Nembol stammt, mit Prüfcode zum Kopieren in vier Sprachen.

Jede Zustellung enthält:

X-Nembol-Signature: t=1784900412,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd
  • t: Unix-Zeitstempel des Zustellversuchs.
  • v1: HMAC-SHA256 mit dem Signatur-Secret deines Endpoints als Schlüssel, berechnet über den String "<t>.<raw_body>". Während des Zeitfensters einer Secret-Rotation siehst du eventuell zwei v1=-Einträge. Akzeptiere, wenn einer davon übereinstimmt.

Prüfschritte: (1) Lies den rohen Request-Body, vor jedem JSON-Parsing oder jeder Umwandlung durch Middleware; (2) berechne den erwarteten HMAC; (3) vergleiche in konstanter Zeit; (4) lehne ab, wenn |now − t| mehr als 5 Minuten beträgt (Schutz vor Replay-Angriffen).

import crypto from 'node:crypto';

// Express: app.post('/webhook', express.raw({ type: 'application/json' }), handler)
export function verifyNembolSignature(rawBody, signatureHeader, secret) {
  const parts = Object.fromEntries(
    signatureHeader.split(',').map((kv) => kv.split('=', 2)),
  );
  const t = Number(parts.t);
  if (!t || Math.abs(Date.now() / 1000 - t) > 300) return false;

  const expected = crypto
    .createHmac('sha256', secret)
    .update(`${t}.${rawBody}`)
    .digest('hex');

  return signatureHeader
    .split(',')
    .filter((kv) => kv.startsWith('v1='))
    .some((kv) => {
      const candidate = Buffer.from(kv.slice(3), 'hex');
      const exp = Buffer.from(expected, 'hex');
      return candidate.length === exp.length && crypto.timingSafeEqual(candidate, exp);
    });
}

Der klassische Fehler: gegen einen neu serialisierten JSON-Body prüfen. Das von deinem Framework geparste und wieder in einen String umgewandelte JSON ist nicht byte-identisch mit dem, was Nembol gesendet hat, und die Signatur stimmt nicht überein. Behalte immer die rohen Bytes.

Zuletzt aktualisiert am 20. Oktober 2026

Brauchst du Hilfe?

Schreib uns, und ein Mensch antwortet, meist innerhalb eines Werktags.