Créez des signatures HMAC-SHA256 localement avec le générateur HMAC. Votre secret et votre message ne quittent jamais votre navigateur.
Ce qu'est réellement HMAC
HMAC (Hash-based Message Authentication Code) est un hash à clé. Il prend un secret et un message et produit une signature de taille fixe qui dépend des deux.
Parce que le secret est intégré au calcul, seule une personne qui connaît le secret peut produire ou vérifier la signature. Cela fait de HMAC le cheval de trait de l'authentification API, de la vérification de webhooks et des payloads signés.
HMAC n'est pas du chiffrement : la signature ne cache rien, et quiconque l'intercepte peut la lire. HMAC apporte l'authentification et l'intégrité — la preuve que le message vient de quelqu'un qui détient le secret.
Quand vous avez besoin de signatures HMAC
Les cas les plus courants : les webhooks et les requêtes API. Quand un fournisseur publie un événement sur votre point de terminaison, la signature confirme l'authenticité du payload. Quand un client appelle votre API, une requête signée prouve qu'il détient le secret.
- Webhooks : le destinataire vérifie la signature pour prouver que le payload provient de l'expéditeur
- Authentification API : les clients signent les requêtes avec un secret partagé au lieu d'envoyer un mot de passe
- Contrôles d'intégrité : détecter les altérations de message entre services
- Protection contre le rejeu : signer un message qui inclut un horodatage ou un nonce
Créer une signature HMAC-SHA256 : pas à pas
La canonicalisation fait échouer les intégrations le plus souvent. Lors de ma première configuration de webhook, chaque signature échouait : l'expéditeur ajoutait un saut de ligne final inattendu. La solution : nous mettre d'accord sur les octets exacts — clés JSON, échappement, fins de ligne.
// Exemple : chaîne canonique et HMAC-SHA256 en Node.jsconst canonical = [method, path, timestamp, body].join('\n');const signature = crypto.createHmac('sha256', secret).update(canonical).digest('hex');- Ouvrez le générateur HMAC dans votre navigateur.
- Sélectionnez SHA-256 comme algorithme.
- Collez votre clé secrète dans le champ clé. Générez-en une avec le générateur de mot de passe si nécessaire.
- Collez le message ou payload exact à signer, octet pour octet.
- Copiez la signature générée et joignez-la à la requête, par exemple comme en-tête Authorization ou X-Signature.
Avertissement: La signature change si un seul octet du message change, et la chaîne exacte que vous signez doit correspondre à ce que l'autre côté signe. Les fins de ligne et les espaces comptent.
Vérifier les signatures en toute sécurité côté réception
La vérification est un second calcul HMAC avec le même secret et le même message, comparé à la signature reçue.
La comparaison doit être en temps constant. Une comparaison de chaînes classique peut fuiter des informations de timing qui aident les attaquants à forger des signatures.
Une comparaison classique s'arrête au premier caractère différent ; le temps de réponse révèle la proximité de la tentative. Avec assez d'échantillons, la signature se reconstitue octet par octet ; une comparaison en temps constant exécute toujours les mêmes opérations.
// Node.js : comparaison en temps constantconst crypto = require('crypto');const expected = Buffer.from(signature, 'hex');const received = Buffer.from(given, 'hex');const valid = expected.length === received.length && crypto.timingSafeEqual(expected, received);Erreurs HMAC courantes
- Coder le secret en dur dans le code côté client où tout le monde peut le lire
- Signer le corps mais pas la méthode, le chemin et l'horodatage, permettant les attaques par rejeu
- Utiliser == ou une comparaison de chaînes classique pour vérifier la signature
- Réutiliser le même secret entre environnements ou ne jamais le faire tourner
- Envoyer la signature dans un outil qui journalise le secret avec le message
- Construire la chaîne canonique différemment du destinataire : ordre des clés JSON, espaces de fin
- Comparer les octets de la signature dans des encodages différents, hex contre base64
FAQ
Q.Le secret HMAC doit-il vivre dans le code client ?
A.Non. Tout ce qui est livré dans un navigateur peut être lu : le secret apparaît dans les outils de développement. Gardez les secrets côté serveur et signez les requêtes côté serveur. La signature côté client ne dissuade que les manipulations occasionnelles.
Q.HMAC est-il du chiffrement ?
A.Non. HMAC est un hash à clé pour l'authentification et l'intégrité : il prouve l'expéditeur et l'intégrité du message, qui reste lisible. Si la confidentialité compte, chiffrez le payload avec AES-GCM ou TLS.
Q.Une signature HMAC peut-elle être inversée ?
A.Aucun moyen pratique n'existe. HMAC est à sens unique, et le secret n'apparaît jamais dans la signature. L'effort se déplace vers la devinette du secret : un secret aléatoire de 256 bits est hors de portée de la force brute. Protégez le secret et faites-le tourner régulièrement.
Références
- RFC 2104 – HMAC : Hachage à clé pour l'authentification de message : https://www.rfc-editor.org/rfc/rfc2104
- NIST FIPS 198-1 – The Keyed-Hash Message Authentication Code (HMAC) : https://csrc.nist.gov/pubs/fips/198-1/final
- RFC 7515 – JSON Web Signature (JWS) : https://www.rfc-editor.org/rfc/rfc7515
- OWASP Secrets Management Cheat Sheet : https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html
Créez une signature
HMAC-SHA256, SHA-1 ou MD5 dans votre navigateur ; votre clé ne quitte jamais l'appareil.
Signez ce que vous envoyez, vérifiez en temps constant
Signez les octets exacts que les deux côtés attendent, joignez la signature comme en-tête et rejetez les requêtes avec des horodatages obsolètes.
Comparez les signatures avec une fonction à temps constant, gardez le secret côté serveur et générez les signatures localement avec le générateur HMAC.
Commencez petit : signez un point de terminaison, vérifiez la signature, faites tourner la clé. La mécanique est simple une fois la chaîne canonique convenue.