Générateur HMAC et validateur de webhooks
Calculez un HMAC-SHA256, SHA-384, SHA-512 ou SHA-1 et vérifiez si la signature reçue avec le webhook correspond. Les modèles GitHub, Stripe, Shopify, Mercado Pago et Slack construisent le message signé comme le fait chaque fournisseur. Le payload et la clé restent dans votre navigateur.
HMAC du payload tel quel, avec l'algorithme et l'encodage de votre choix.
La signature couvre le corps brut, octet par octet. Un espace, un saut de ligne ou un ordre des champs différent change déjà le résultat. Collez le corps exactement tel qu'il est arrivé, avant JSON.parse ou un formateur.
Signature
Il manque la clé
Saisissez la clé secrète. La signature s'affiche pendant la saisie.
Un JWT HS256 est un HMAC-SHA256 du header et du payload. Le décodeur vérifie la signature du token avec votre secret.
Vous voulez lire le payload du webhook ? Formatez-le dans un autre onglet. Le JSON formaté a d'autres octets et ne permet pas de vérifier la signature.
Besoin seulement d'un hash, sans clé ? Le générateur de hash calcule MD5, SHA-1 et SHA-256 de textes et de fichiers.
Qu'est-ce que HMAC
HMAC est un hash calculé avec une clé secrète (RFC 2104). N'importe qui peut recalculer un simple SHA-256 après avoir modifié le message. Avec HMAC, seul celui qui connaît la clé peut produire la bonne signature. C'est pourquoi on l'utilise pour prouver qu'une requête vient bien de son émetteur et n'a pas été modifiée en route : webhooks, signature d'API comme AWS Signature V4 et tokens JWT HS256.
Format de chaque fournisseur
Chaque fournisseur choisit ce qu'il signe et comment il écrit le résultat. Le tableau résume les modèles de cette page ; chaque format a été vérifié dans la documentation officielle du fournisseur.
| Fournisseur | En-tête | Ce qui est signé | Format |
|---|---|---|---|
| GitHub | X-Hub-Signature-256 | corps | sha256=<hex> |
| Stripe | Stripe-Signature | t.corps | t=<ts>,v1=<hex> |
| Shopify | X-Shopify-Hmac-Sha256 | corps | <base64> |
| Mercado Pago | x-signature | id:…;request-id:…;ts:…; | ts=<ts>,v1=<hex> |
| Slack | X-Slack-Signature | v0:timestamp:corps | v0=<hex> |
Comment fonctionne la vérification d'un webhook
Le fournisseur et votre application partagent le même secret. En envoyant l'événement, le fournisseur calcule le HMAC du corps, ou d'un message construit avec un timestamp et le corps, et envoie le résultat dans un en-tête. Votre application le recalcule avec le corps reçu et compare. Si cela correspond, l'événement est authentique. La comparaison doit se faire en temps constant, avec crypto.timingSafeEqual en Node, hash_equals en PHP ou hmac.compare_digest en Python, pour ne pas laisser fuir la signature par le temps de réponse.
La première cause de signature invalide
Le framework transforme le JSON en objet avant votre code, et en le sérialisant à nouveau, l'ordre des clés, les espaces et l'échappement des accents changent. La signature ne correspond plus, même avec la bonne clé. Lisez le corps brut : express.raw() dans Express, $request->getContent() dans Laravel, un paramètre String avec @RequestBody dans Spring et request.get_data() dans Flask. Dans NestJS, créez l'application avec rawBody: true et utilisez req.rawBody.
Clé en texte, hex ou Base64
HMAC travaille sur les octets de la clé. Si le tableau de bord du fournisseur affiche un secret en hex et que vous utilisez cette chaîne comme texte, les octets diffèrent et la signature aussi. La plupart des fournisseurs de webhooks, dont GitHub, Stripe, Shopify, Mercado Pago et Slack, utilisent le secret comme texte, tel qu'il apparaît dans le tableau de bord, préfixe whsec_ de Stripe compris.
Timestamp et rejeu
Une requête valide interceptée reste valide si elle est renvoyée. Stripe et Slack placent le timestamp dans le message signé, et leurs bibliothèques refusent les événements de plus de 5 minutes. En testant avec un ancien payload copié depuis un log, la signature peut correspondre ici et être quand même refusée par votre serveur à cause de l'heure.
Questions fréquentes sur HMAC
Signature de webhooks, clé, encodage et les erreurs de validation les plus courantes.