Anmelden

HMAC-SHA256-Signaturen von SMS-Webhooks prüfen

So stellen Sie sicher, dass die Anfrage wirklich von DroidSender kommt und nicht von jemand anderem.

Zuletzt aktualisiert

HeaderInhalt
X-DroidSender-Eventder Name des Ereignisses, derselbe wie im Body
X-DroidSender-Deliverykennzeichnet einen Zustellversuch; zum Deduplizieren verwenden Sie event plus data.id (plus data.status bei sent, delivered und failed)
X-DroidSender-Signaturedie Signatur, unten beschrieben
User-AgentDroidSender-Webhooks/2.0

Jede Anfrage enthält den Header X-DroidSender-Signature in der Form t=<Unix-Sekunden>,v1=<hex>, wobei v1 der HMAC-SHA256 von "<t>.<roher Body>" mit dem Secret Ihres Webhooks ist.

const crypto = require("crypto");

function signatureIsValid(rawBody, header, secret) {
  const match = /^t=(\d+),v1=([0-9a-f]{64})$/.exec(header ?? "");
  if (!match) return false;

  const [, t, received] = match;

  // der Zeitstempel ist Teil der signierten Daten: Eine abgefangene Zustellung
  // lässt sich nicht morgen erneut einspielen, und t ist ohne das Secret nicht änderbar
  const age = Math.abs(Math.floor(Date.now() / 1000) - Number(t));
  if (age > 300) return false;

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

  // Vergleich in konstanter Zeit: Ein einfaches === macht das Secret messbar
  return crypto.timingSafeEqual(
    Buffer.from(expected, "hex"),
    Buffer.from(received, "hex"),
  );
}

Ihre Cookie-Einstellungen

Wir verwenden notwendige Cookies, damit diese Website funktioniert. Mit Ihrer Einwilligung nutzen wir auch Analyse- und Werbe-Cookies, um Besuche zu verstehen und unsere Anzeigen zu messen. Sie können Ihre Auswahl jederzeit in den Cookie-Einstellungen ändern. Cookie-Richtlinie