Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Add WebhookSignatureValidator utility#340

Merged
danielalfarourrea merged 3 commits into
masterfrom
feature/webhook-signature
May 21, 2026
Merged

Add WebhookSignatureValidator utility#340
danielalfarourrea merged 3 commits into
masterfrom
feature/webhook-signature

Conversation

@danielalfarourrea

Copy link
Copy Markdown
Contributor

Summary

Adds a stateless utility to verify the authenticity of incoming MercadoPago webhook notifications by recomputing the HMAC-SHA256 signature and comparing it against the x-signature header in constant time (timing-attack safe).

Changes

  • webhook/WebhookSignatureValidator.java: HMAC-SHA256 validator with explicit secret per call, no MercadoPagoConfig dependency
  • exceptions/MPInvalidWebhookSignatureException.java: typed exception thrown on validation failures
  • exceptions/SignatureFailureReason.java: enum of specific failure reasons (missing header, malformed signature, hash mismatch, etc.)
  • webhook/WebhookSignatureValidatorTest.java: unit tests covering success, malformed inputs, timestamp window, hash mismatch

Test plan

  • CI green

danielalfarourrea and others added 3 commits May 13, 2026 13:30
Verifies MercadoPago webhook notifications by recomputing the HMAC-SHA256
signature locally and comparing it in constant time (MessageDigest.isEqual)
against the value in the x-signature header. Stateless, performs no
outbound HTTP calls.

- com.mercadopago.webhook.WebhookSignatureValidator
- com.mercadopago.exceptions.MPInvalidWebhookSignatureException
  (extends MPException; checked; Lombok @Getter)
- com.mercadopago.exceptions.SignatureFailureReason enum
- Optional Duration tolerance for replay protection
- Forward-compatible supportedVersions parameter (default List.of("v1"))
- 16 JUnit 5 tests covering the canonical cases

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
@danielalfarourrea danielalfarourrea merged commit 37c6a3b into master May 21, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant