Wie kann ein Webhook-Aufruf verifiziert werden?
Intro
In diesem Artikel zeigen wir Ihnen, wie Sie Webhook-Aufrufe in Ihrer Anwendung verifizieren können. Diese Verifizierung stellt sicher, dass der Webhook-Aufruf tatsächlich von der erwarteten Quelle stammt (smino api), indem wir einen SHA512-Hash verwenden, der mit einem geheimen Schlüssel (Secret), einem Zeitstempel und einer Event-ID generiert wird.
Voraussetzungen
Ein Webhook wurde eingerichtet und ein geheimer Schlüssel (Secret) wurde festgelegt. Der Webhook-Aufruf enthält einen Header (x-hook-signature), die den vom Server gesendeten Hash enthält.
Funktionsweise
Die Verifizierung eines Webhook-Aufrufs erfolgt in drei Schritten:
Extrahieren der benötigten Informationen: Der Server sendet einen Hash-Wert im Header des Webhook-Aufrufs, den wir mit dem Namen x-hook-signature abfangen.
Erstellen des erwarteten Hashes: Wir generieren einen Hash aus dem Secret, dem Zeitstempel und der Event-ID, die der Webhook enthält.
Vergleichen der Hashes: Der empfangene Hash wird mit dem von uns erzeugten Hash verglichen. Stimmen die Hashes überein, kann der Webhook als verifiziert betrachtet werden.
Beispiel in C#
Hier ist ein Beispielcode in C#, der zeigt, wie die Verifizierung durchgeführt wird:
using System.Globalization;
using System.Security.Cryptography;
using System.Text;
var response = new HttpResponseMessage();
const string signatureHeader = "x-hook-signature";
response.Headers.Add(signatureHeader, "<serverHash>");
const string secret = "<your secret>";
var payload = new { ExportId = Guid.NewGuid(), TimeStamp = DateTime.UtcNow.ToString(CultureInfo.InvariantCulture) };
var expectedHash = CreateHash($"{payload.ExportId}.{payload.TimeStamp}.{secret}");
var responseHash = response.Headers.GetValues(signatureHeader).Single();
VerifyHash(responseHash, expectedHash);
static string CreateHash(string signature)
{
var sha512 = SHA512.Create();
var bytes = Encoding.UTF8.GetBytes(signature);
var hash = sha512.ComputeHash(bytes);
return string.Concat(hash.Select(hashByte => hashByte.ToString("x2")));
}
static bool VerifyHash(string responseHash, string expectedHash)
{
return responseHash == expectedHash;
}
Wichtige Hinweise: Der Zeitstempel sollte immer in UTC-Zeit verwendet werden, um sicherzustellen, dass er konsistent ist. Stellen Sie sicher, dass Ihr Secret sicher aufbewahrt und nicht öffentlich zugänglich ist. Der x-hook-signature Header ist entscheidend, da dieser die Verifizierung ermöglicht. Mit dieser Vorgehensweise können Sie sicherstellen, dass Webhook-Aufrufe in Ihrer Anwendung authentisch sind und nur von autorisierten Quellen stammen.
Aktualisiert am: 14/10/2024
Danke!