Tout ce qui mérite d'être su, rien qui ne le mérite pas.
Comment la signature est construite
Une construction courante forme la chaîne canonique `${timestamp}.${requestBody}`, calcule `HMAC-SHA256(canonical, secret)`, l'encode en hexadécimal et envoie l'empreinte et l'horodatage dans un en-tête de signature. Inclure l'horodatage dans la charge signée empêche les attaques par rejeu : votre point de terminaison doit rejeter les webhooks de plus de 5 minutes. Les noms d'en-têtes et le format canonique exact varient d'une plateforme à l'autre ; confirmez-les auprès de votre fournisseur avant d'écrire le code de vérification.
Pourquoi les signatures HMAC et non RSA ?
HMAC est symétrique (les deux parties partagent un secret), ce qui signifie que la signature et la vérification sont environ 10 000 fois plus rapides qu'avec RSA-2048. Dans le cas d'une diffusion massive de webhooks où un seul SMSC peut émettre jusqu'à 50 000 DLR par seconde, la signature RSA monopolise le processeur. Sur du matériel moderne, HMAC-SHA256 s'exécute en quelques microsecondes. En contrepartie, quiconque détient le secret peut signer ; le secret ne doit donc être partagé qu'entre la plateforme et votre environnement, stocké comme n'importe quel identifiant et pouvoir être renouvelé à la demande.
Pièges de la vérification
Trois bogues courants : comparer des chaînes avec `==` au lieu d'une comparaison en temps constant (attaque temporelle — utilisez `crypto.timingSafeEqual`) ; valider la signature après l'analyse JSON du corps (vous devez vérifier les octets bruts, et non une représentation resérialisée — le réordonnancement JSON invalide le hachage) ; oublier la fenêtre anti-rejeu de l'horodatage.
Au-delà de HMAC
Pour les environnements réglementés (banques, santé), certaines plateformes prennent aussi en charge la livraison des webhooks en mTLS : l'expéditeur présente un certificat client que votre répartiteur de charge valide avant que la requête n'atteigne l'application. C'est plus robuste que HMAC, car la livraison est liée à une clé matérielle, mais cela ne se justifie que pour des charges réellement sensibles. Pour la plupart des intégrations, HMAC-SHA256 sur HTTPS est la bonne réponse.