Vérifier une signature HMAC SHA-256 de webhook
Lorsqu’un service tiers envoie un webhook, il peut signer le corps avec un secret partagé et un algorithme HMAC SHA-256. Votre endpoint doit recalculer le digest sur le corps brut et comparer le résultat à l’en-tête fourni, sans parser le JSON avant la vérification.
Checklist rapide
- Stocker le secret dans une variable d’environnement (jamais dans le dépôt).
- Lire le corps en mode brut (buffer / string) avant tout
json_decodeourequest.json(). - Calculer
HMAC_SHA256(secret, rawBody)(souvent encodé en hexadécimal). - Comparer avec l’en-tête attendu via une fonction timing-safe.
- Rejeter avec
401ou403si la signature est absente ou invalide.
Générateur de snippets
Cas particuliers (Stripe, Shopify…)
Stripe regroupe timestamp et signatures multiples dans Stripe-Signature ; Shopify attend un HMAC
base64. Le principe reste le même (corps brut + secret), seul le parsing de l’en-tête change. Pour tester un
payload signé, utilisez le
vérificateur HMAC en ligne, le
générateur JSON et curl ou la
galerie de templates.
Questions fréquentes
Pourquoi utiliser le corps brut (raw body) ?
Le HMAC est calculé sur les octets exacts reçus. Si votre framework parse le JSON puis le resérialise, l’ordre des clés ou les espaces peuvent changer et invalider la signature.
Pourquoi une comparaison « timing-safe » ?
Une comparaison caractère par caractère classique peut fuiter des informations via le temps d’exécution. hash_equals (PHP), crypto.timingSafeEqual (Node) ou hmac.compare_digest (Python) évitent ce risque.
Quel en-tête lire ?
Cela dépend de l’émetteur : Stripe-Signature, X-Shopify-Hmac-SHA256, X-Hub-Signature-256 (GitHub), etc. Consultez la documentation du fournisseur pour le format exact (parfois préfixe sha256=).
Passez de l’idée au premier webhook en quelques minutes
Créez un compte gratuit, générez une URL et connectez votre première action.
Forfait Free · sans carte bancaire · 100 événements inclus