JWS Detached
JSON Web Signatures (JWS) begegnen Entwickler meist im Hintergrund. Libs und Frameworks liefern alles, somit kommen viele nicht direkt in Kontakt mit JWS.
Manchmal muss man halt einen SaaS integrieren, diese bieten keine Libs. Ein solcher Fall ist mir heute begegnet. Dieser SaaS macht ein Callback und der Payload ist über ein JWS abgesichert. Die “detached JWS” wird im Header geliefert.
X-JWS-SIGNATURE: eyJhbGciOiJIUzI1NiJ9..NsolKSrrFivUFZx_qixwfrogkrpdkz54QyiWlosngwQ
Dabei muss dann zwischen den zwei .. der Payload Base64 abgefüllt werden. Signatur mit
dem geheimen Passwort prüfen. Fertig!
Für eine längere Zeit (ca. ein Jahr) war diese Signaturprüfung einwandfrei. Callback vom SaaS wurden einwandfrei geliefert. Doch am Tag X waren plötzlich Signaturen kaputt. Der SaaS hat etwas am Payload geändert.
🕵️♂️
Als erstes hab ich den Cyberchef geöffnet und JWS geprüft. Natürlich den detached JWS genommen und im Cyberchef zusammengestellt. Irgendwie wolte nichts gelingen. Dafür hab ich auch den Payload mal klein gemacht:
{"what":"ever","iat":1742495500}
Wird nach Base64
eyJ3aGF0IjoiZXZlciIsImlhdCI6MTc0MjQ5NTUwMH0=
Dann in den Detached rein:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ3aGF0IjoiZXZlciIsImlhdCI6MTc0MjQ5NTUwMH0=.gqv9tvbK2MNyJ7b6wtmBdYk7HB_Q9urcVRAE-6dUI_o
😠😠😠
Eigentlich sollte nun der Blogleser schon längst:

Denn der Fehler war PADDING!
Der Callback war immer korrekt, da zufälligerweise die Daten Base64 encodiert nie einen Padding = hatten.
Korrekt Base64 encodiert ohne Padding:
eyJ3aGF0IjoiZXZlciIsImlhdCI6MTc0MjQ5NTUwMH0
Ergibt ein JWS von:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ3aGF0IjoiZXZlciIsImlhdCI6MTc0MjQ5NTUwMH0.gqv9tvbK2MNyJ7b6wtmBdYk7HB_Q9urcVRAE-6dUI_o