Inledning
I den här artikeln går vi igenom hur du programmatiskt kan validera signaturen på en webhook som kommer från oss.
Varför ska jag validera signaturen?
Det finns många anledningar, men de främsta är säkerhet och dataintegritet. Genom att validera vår signatur kan du säkerställa att innehållet i webhooken faktiskt kommer från Semesterlistan och att den inte har ändrats sedan den skickats från oss.
Vad är en signatur?
Varje gång en webhook skickas från Semesterlistan kommer vi att signera denna med en HMAC-SHA256 hash som byggs upp utifrån innehållet, tiden den skickades, meddelandets ID och den hemliga koden ni angav på webhooken. Denna hash blir sedan Base64-encodad, och läggs i headern "x-webhook-signature".
Hashen byggs upp av följande 3 saker:
- Innehållet i webhooken (nedan kallat "message")
- Tidpunkten meddelandet skickades (finns i headern "x-webhook-original-sent")
- Webhookens message ID ("x-webhook-original-messageid")
HMAC-hashningen använder sig av webhookens hemliga kod som secret.
Hur validerar jag en signatur?
För att validera en webhook så behöver du bygga upp en signatur på er sida och jämföra den med signaturen på webhooken. Detta gör du genom följande steg:
- Skapa en sträng som innehåller message, tidpunkten och messageID i formatet "message||timestamp||messageid"
- Gör en HMAC-hash av strängens bytes, med den hemliga koden som secret
- Konvertera hashen till en Base64-sträng
- Jämför strängen med vår signatur
Om signaturerna stämmer överens så är allt korrekt, och du kan fortsätta behandla webhooken.
Exempel
Här kommer ett exempel på hur du räknar ut en signatur i C#.
var secret = "examplesecret"; var message = @"This is an example"; var messageSent = DateTimeOffset.Parse("2025-01-01 00:00:00.0000000 +00:00"); var messageId = Guid.Parse("f8967ad8-42ab-4872-b882-6ca7eb775218"); var hmac = new HMACSHA256( Encoding.UTF8.GetBytes(secret) ); var hash = hmac.ComputeHash( Encoding.UTF8.GetBytes( $"{message}||{messageSent}||{messageId}" ) ); var hashString = Convert.ToBase64String(hash); //hashString: Ua1Kmw2K9k6RkEKU7kUI8ArLMbWXL1D0i++bBaB/ShM=
Testa valideringen
Givet dessa parametrar:
- Secret/hemlig kod = "examplesecret"
- Message/innehåll = "This is an example"
- Tidsstämpel = "2025-01-01 00:00:00.0000000 +00:00"
- MessageID = "f8967ad8-42ab-4872-b882-6ca7eb77521"
Så borde du få ut den Base64-encodade strängen "Ua1Kmw2K9k6RkEKU7kUI8ArLMbWXL1D0i++bBaB/ShM=" som resultat. Fick du det så funkar allt, och du kan använda din funktion för att validera våra webhooks.