> ## Knowledge Base Index
> Fetch the complete knowledge base index at: https://help.smino.com/sitemap.xml
> Use this file to discover available pages before exploring further.
> Pure-Markdown content can be obtained by appending a '.md' suffix to the content URLs listed in the sitemap (without the trailing slash).

# Wie kann ein Webhook-Aufruf verifiziert werden?


### Intro

In diesem Artikel zeigen wir dir, wie du Webhook-Aufrufe in deiner Anwendung verifizieren kannst. Diese Verifizierung stellt sicher, dass der Webhook-Aufruf tatsächlich von der erwarteten Quelle (smino API) stammt, indem du einen SHA512-Hash verwendest, 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) festgelegt. Der Webhook-Aufruf enthält einen Header (x-hook-signature), der 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 du mit dem Namen x-hook-signature abfangen kannst.

* **Erstellen des erwarteten Hashes:** Du generierst 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 dir erzeugten Hash verglichen. Stimmen die Hashes überein, kannst du den Webhook als verifiziert betrachten.

###### Beispiel in C#
Hier ist ein Beispielcode in C#, der zeigt, wie du die Verifizierung durchführen kannst:

```cs
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 { EventId = Guid.NewGuid(), TimeStamp = DateTime.UtcNow.ToString(CultureInfo.InvariantCulture) };

var expectedHash = CreateHash($"{payload.EventId:N}.{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"))).ToUpper(); 
}

static bool VerifyHash(string responseHash, string expectedHash)
{
    return responseHash == expectedHash; 
}
```

| Wichtige Hinweise: Der Zeitstempel sollte jeweils nur als string übernommen / geparst werden, da ein Parsing in ein DateTime-Objekt oder Ähnliches Fehlerquellen bzgl. der Formatierung beinhalten kann. Stelle sicher, dass dein 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 kannst du sicherstellen, dass Webhook-Aufrufe in deiner Anwendung authentisch sind und nur von autorisierten Quellen stammen.