Inhalt dieses Artikels
- Vorbemerkungen
- plenigo-Signatur prüfen
1. Vorbemerkungen
Jeder Callback aus dem plenigo System ist mit einer Signatur versehen, die im Header zu finden ist, um sicherzustellen, dass der Aufruf von einer vertrauenswürdigen Quelle stammt und nicht manipuliert wurde.
2. plenigo-Signatur prüfen
Jeder Callback wird über einen Signatur-Header signiert.
Der Header heißt plenigo-signature und sieht wie folgt aus:
t=1729583536,s=fdcd0a0ccd0b4db629d35a33c3aada5cf669a28f91adb38abcc9ffcdb1663d38 |
Der Header enthält zwei Elemente. Einen Zeitstempel, der den Zeitpunkt angibt, zu dem der Rückruf erzeugt wurde (t), und einen hashbasierten Nachrichtenauthentifizierungscode (HMAC) mit SHA-256 (s).
Um den Header zu verifizieren, wie folgt vorgehen:
Schritt 1: Zeitstempel und Signaturen aus dem Header extrahieren
Der Inhalt des Headers kann mit dem Zeichen "," (Komma) getrennt werden, um eine Liste von Elementen zu erhalten. Durch das Zeichen "=" (Gleichheitszeichen) als Trennzeichen kann jedes Element in ein Datenpaar aus einem Präfix und einem Wert unterteilt werden.
Werte der Präfixe:
- "t" = Zeitstempel
- "u" = unique Id
- "s" = eine Signatur oder mehrere Signaturen
Schritt 2: Zeichenkette "signed_payload" vorbereiten
Die Zeichenfolge "signed_payload" wird durch eine Verkettung erstellt:
- der Zeitstempel als String
- das Zeichen "." (Punkt)
- der eigentliche JSON-Payload (d. h. der Anfrageinhalt) als String
Schritt 3: Erwartete Signatur bestimmen
Es wird ein HMAC Authentifizierungscode mit einer SHA256-Hash-Funktion benötigt. Das Signiergeheimnis des Endpunkts wird als Schlüssel und die Zeichenkette "signed_payload" als Nachricht verwendet.
Schritt 4: Signaturen vergleichen
Die Signatur (oder Signaturen) in der Kopfzeile sollte mit der erwarteten Signatur verglichen werden.
Für den Vergleich sollte die Differenz zwischen dem aktuellen Zeitstempel und dem empfangenen Zeitstempel errechnet werden, um dann zu entscheiden, ob die Differenz innerhalb einer akzeptablen Toleranz liegt.
Zum Schutz vor timing attacks (eine Variante eines Seitenkanalangriffs) empfiehlt es sich, einen zeitlich konstanten String-Vergleich durchzuführen, um die erwartete Signatur mit jeder der empfangenen Signaturen zu vergleichen.