Comment calculer un HMAC en Base64
- Le mode HMAC et SHA-256 sont sélectionnés. Choisissez un autre algorithme sous Algorithme si votre API utilise SHA-1, SHA-384, SHA-512 ou MD5.
- Saisissez la Clé secrète et réglez La clé est : Texte (UTF-8) pour une chaîne secrète ordinaire, Hex ou Base64 si la clé est fournie sous forme d’octets encodés.
- Saisissez ou collez le message dans Texte, ou passez Entrée sur Fichier et déposez le fichier exact du payload.
- Copiez la signature en Base64, en Base64URL ou en hex. Tous les algorithmes affiche le HMAC avec tous les hachages à la fois, ce qui aide quand la documentation reste vague sur celui qui est utilisé.
Une clé vide est acceptée et donne quand même un résultat, avec une note précisant qu’un tel HMAC ne protège rien.
Exemples de valeurs
Avec la clé key et le message The quick brown fox jumps over the lazy dog :
| Algorithme | HMAC en Base64 |
|---|---|
| HMAC-MD5 | gAcHE0Y+d0m5DC3CSRHidQ== |
| HMAC-SHA1 | 3nybhbi3iqa8ino29wqQcBydtNk= |
| HMAC-SHA256 | 97yD9DBThCSxMpjmqm+xQ+9NWaFJRhdZl0edvC0aPNg= |
| HMAC-SHA512 | tCrwkFe6weLUFwjkipAuCbX/fxKrQopP6GZTxz3SSPuC+UilSfe3kaW0GRXuTR7Dk1NX5OIxclDQNyr6Lr7rOg== |
En hex, la valeur HMAC-SHA256 est f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8, le vecteur de test bien connu de l’article Wikipédia sur HMAC. L’encodage de la clé change le résultat : le texte a2V5 utilisé comme clé donne 5O+7AtpguFrgIRw1qXGU+m0OaTs1oV1kwRQ/hI1WAUE=, alors que a2V5 lu comme du Base64 correspond aux octets de key et redonne 97yD9DBT….
Signatures de webhooks : Base64 ou hex
Les fournisseurs s’accordent sur HMAC, mais ni sur l’encodage de sortie ni sur ce qui est signé. Quelques exemples bien documentés :
| Fournisseur | En-tête | Algorithme | Encodage | Contenu signé |
|---|---|---|---|---|
| Shopify | X-Shopify-Hmac-Sha256 | HMAC-SHA256 | Base64 | corps brut de la requête |
| Standard Webhooks (Svix) | webhook-signature: v1,… | HMAC-SHA256 | Base64 | id.timestamp.body, clé tirée du Base64 whsec_ |
| Twilio | X-Twilio-Signature | HMAC-SHA1 | Base64 | URL plus paramètres POST triés |
| GitHub | X-Hub-Signature-256: sha256=… | HMAC-SHA256 | hex | corps brut de la requête |
| Stripe | Stripe-Signature: t=…,v1=… | HMAC-SHA256 | hex | timestamp.body |
Quand une valeur de cet outil correspond à l’hex mais que votre code compare du Base64, ou l’inverse, le calcul est juste et seul l’encodage diffère. Vérifiez dans la documentation du fournisseur ce qui est signé ; les préfixes d’horodatage servent à empêcher le rejeu d’anciennes requêtes.
Vérifier une signature dans le code
Comparez les octets bruts en temps constant, et assurez-vous de hacher le corps exactement tel qu’il a été reçu :
const crypto = require("crypto");
function verifyWebhook(rawBody, secret, signatureHeader) {
const expected = crypto.createHmac("sha256", secret).update(rawBody).digest();
const given = Buffer.from(signatureHeader, "base64");
return given.length === expected.length && crypto.timingSafeEqual(given, expected);
}
Avec rawBody comme Buffer de la phrase du renard, le secret key et la valeur Base64 du tableau, la fonction renvoie true. Donnez-lui JSON.stringify(JSON.parse(body)) au lieu du corps brut et elle renvoie false dès que le JSON du fournisseur contenait une espace que votre sérialiseur supprime. Dans Express, cela signifie lire le corps avec express.raw() sur la route du webhook.
L’équivalent Python utilise hmac.new(key, body, hashlib.sha256).digest(), encode le résultat en Base64 et compare avec hmac.compare_digest. En ligne de commande, openssl dgst -sha256 -hmac 'key' -binary | base64 donne le même Base64 ; utilisez -mac HMAC -macopt hexkey:… quand la clé est en hex. Pour une clé solide, le préréglage Secret HMAC du générateur de clés Base64 produit 32 octets aléatoires. Pour des jetons signés plutôt que des requêtes signées, voir l’encodeur JWT.
FAQ
Pourquoi le HMAC de mon webhook ne correspond-il pas ?
La signature porte sur les octets exacts du corps de la requête. Si votre framework a analysé le JSON et que vous hachez une copie resérialisée, les espaces ou l’ordre des clés changent et le résultat diffère. Hachez le corps brut, vérifiez si le fournisseur attend de l’hex ou du Base64, et si le secret doit d’abord être décodé.
Le secret HMAC est-il du texte ou du Base64 ?
Cela dépend du fournisseur. La plupart fournissent une chaîne utilisée comme texte UTF-8. Certains remettent une clé encodée en Base64, parfois après un préfixe comme whsec_, qu’il faut décoder en octets avant usage. Réglez La clé est en conséquence.
Quelle est la différence entre un hachage et un HMAC ?
N’importe qui peut calculer le SHA-256 d’un message : un hachage ne détecte donc que les modifications accidentelles. Un HMAC y mêle une clé secrète, si bien que seul le détenteur de la clé peut produire une valeur valide, ce qui en fait une signature.
Puis-je utiliser HMAC-MD5 ou HMAC-SHA1 ?
Les deux sont encore utilisés par d’anciennes API et restent bien plus solides que MD5 ou SHA-1 seuls, car les collisions ne se traduisent pas en falsifications de HMAC. Pour une nouvelle conception, choisissez HMAC-SHA256.