Skip to content

Générateur HMAC & vérificateur de signature

Générateur et vérificateur HMAC en ligne gratuit. Calculez HMAC-SHA256/SHA1/SHA384/SHA512 avec des clés en texte, hex ou Base64 et une sortie Hex/Base64/Base64URL. 100 % dans votre navigateur — les clés ne quittent jamais la page.

Sans pistage Fonctionne dans le navigateur Gratuit
100 % dans votre navigateur — votre message et votre clé secrète ne quittent jamais votre appareil.
HMAC généré

Qu'est-ce qu'un HMAC ?

Un HMAC (Hash-based Message Authentication Code) est une courte étiquette de longueur fixe qui prouve qu'un message est à la fois non modifié et authentique — qu'il a été produit par quelqu'un détenant une clé secrète partagée. Défini dans la RFC 2104 et FIPS 198-1, HMAC combine n'importe quelle fonction de hachage cryptographique avec une clé secrète selon une construction imbriquée précise, écrite HMAC(K, m) = H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)). Le hachage interne lie la clé au message ; le hachage externe enveloppe le résultat, ce qui rend HMAC résistant aux attaques par extension de longueur qui affectent les fonctions SHA-1 et SHA-256 brutes.

HMAC est partout dans l'infrastructure web moderne. Il signe les webhooks pour que vous puissiez confirmer qu'une requête entrante provient bien de GitHub, Stripe, Slack ou Twilio et n'a pas été forgée. Il signe les requêtes d'API (AWS Signature Version 4 repose sur HMAC-SHA256) pour qu'un serveur puisse authentifier l'appelant sans envoyer de mot de passe sur le réseau. C'est le S de HS256 : un JWT signé avec HS256 porte un HMAC-SHA256 sur son en-tête et sa charge utile, que vous pouvez inspecter avec l'encodeur JWT. Il sous-tend aussi la dérivation de clés TLS (HKDF), les algorithmes de mots de passe à usage unique (HOTP/TOTP) et l'intégrité des messages dans d'innombrables services internes.

Cet outil calcule HMAC entièrement dans votre navigateur via crypto.subtle.sign('HMAC', ...) de l'API Web Crypto — la même primitive que les navigateurs utilisent lors des handshakes TLS. Votre clé secrète et votre message ne sont jamais téléversés, c'est donc sûr pour des secrets de signature de production. Comme le même secret peut s'exprimer en texte brut, en hex ou en base64, l'outil vous laisse choisir explicitement l'encodage de la clé, et comme différents fournisseurs attendent l'étiquette sous différentes formes, vous pouvez sortir en Hex, Base64 ou Base64URL. L'onglet Vérifier vous permet de contrôler une signature reçue, à l'aide d'une comparaison en temps constant pour que la vérification elle-même ne révèle aucune information temporelle.

const crypto = require('crypto');

// HMAC-SHA256 with a UTF-8 text key, hex output
const hmac = crypto
  .createHmac('sha256', 'my-secret-key')
  .update('Hello, World!')
  .digest('hex');

console.log(hmac);
// → 'cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699'

// Verify a signature in constant time
function verify(message, key, expectedHex) {
  const actual = crypto.createHmac('sha256', key).update(message).digest();
  const expected = Buffer.from(expectedHex, 'hex');
  return actual.length === expected.length &&
    crypto.timingSafeEqual(actual, expected);
}

Fonctionnalités clés

Générer et vérifier dans un seul outil

Générez une signature dans l'onglet Générer, ou collez un HMAC attendu dans l'onglet Vérifier pour authentifier un webhook ou un jeton entrant. La vérification utilise une comparaison en temps constant, donc le résultat ne révèle jamais d'information temporelle.

Choisir l'encodage de la clé

Interprétez votre secret comme Texte (UTF-8), Hexadécimal ou Base64. C'est le réglage que la plupart des autres outils omettent — et la cause la plus fréquente du calcul de HMAC différents par deux systèmes pour la même clé.

Trois encodages de sortie

Sortez l'étiquette en Hex (webhooks GitHub, AWS), Base64 (Stripe, Twilio, beaucoup d'API) ou Base64URL (JWT et jetons compatibles URL) pour qu'elle corresponde à votre intégration sans conversion manuelle.

Quatre algorithmes natifs

HMAC-SHA256 par défaut, plus SHA-1, SHA-384 et SHA-512. Tous s'exécutent sur l'API Web Crypto du navigateur, donc aucune bibliothèque cryptographique JavaScript à approuver et aucune perte de performance.

100 % côté client et privé

Votre clé secrète et votre message sont traités entièrement dans votre navigateur et ne sont jamais envoyés à un serveur. Ouvrez l'onglet Réseau et vous verrez zéro requête sortante — sûr pour des secrets de signature de production.

Calcul en direct

Le HMAC se recalcule instantanément quand vous modifiez le message, la clé, l'encodage ou l'algorithme — pas d'aller-retour via un bouton Générer, vous pouvez donc expérimenter les encodages jusqu'à ce que votre valeur corresponde à celle du serveur.

Bâti sur des vecteurs testés

La sortie est validée par rapport aux vecteurs de test HMAC officiels de la RFC 4231, vous pouvez donc avoir confiance que les condensés correspondent à ce que produisent OpenSSL, le module crypto de Node et la bibliothèque hmac de Python.

Exemples HMAC

Démarrage rapide — HMAC-SHA256, sortie hex

Hello, World!
cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699

Avec la clé « my-secret-key » (encodage de clé = Texte), l'algorithme HMAC-SHA256 et le format de sortie = Hex, le message « Hello, World! » produit cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699. C'est le condensé hex canonique de 64 caractères que vous obtenez avec crypto.createHmac('sha256', key).update(msg).digest('hex') de Node.

Vérifier un webhook façon Stripe (sortie Base64)

{"id":42,"event":"user.created"}
Cd2f7zTKaJFeG6k+t1FcvDPn51OAZ2f4GrxkCUgMhGs=

De nombreux fournisseurs de webhooks envoient la signature en Base64. Avec la clé « whsec_test_secret » (Texte), HMAC-SHA256 et le format de sortie = Base64, le corps JSON se signe en Cd2f7zTKaJFeG6k+t1FcvDPn51OAZ2f4GrxkCUgMhGs=. Collez cette valeur dans l'onglet Vérifier pour confirmer que la requête provient bien de votre fournisseur avant de la traiter. En interne, HMAC s'appuie sur la même primitive que notre générateur de hash SHA-256, mais avec votre secret comme clé.

Vecteur de référence RFC 4231

what do ya want for nothing?
5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843

Il s'agit du cas de test 2 de la RFC 4231, le document officiel des vecteurs de test HMAC. Avec la clé « Jefe » (Texte), HMAC-SHA256 et sortie Hex, le message « what do ya want for nothing? » donne 5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843. Reproduire cette valeur exacte est la façon de prouver qu'une implémentation HMAC est correcte.

HMAC-SHA512 pour un condensé plus long

The quick brown fox
36f44b125a8a90639dc46733039571792e081e0fd8685ff746784b02ed14aa35629d562c7117cde4a701570551faa5a5e1b7ef1eb5c3bcd4cc1fdb8923fcf14e

Passez l'algorithme à HMAC-SHA512 pour un condensé de 128 caractères (512 bits). Avec la clé « key » (Texte) et une sortie Hex, « The quick brown fox » produit la valeur ci-dessus. SHA-512 est plus rapide que SHA-256 sur la plupart du matériel 64 bits et donne une sortie plus grande, même si SHA-256 reste la valeur par défaut pour l'interopérabilité.

Comment générer & vérifier un HMAC

  1. 1

    Choisir l'algorithme

    Choisissez HMAC-SHA256 (la valeur par défaut et le bon choix pour presque tous les webhooks, API et JWT), ou passez à SHA-1, SHA-384 ou SHA-512 pour correspondre à un système qui l'exige. Les quatre s'exécutent nativement dans votre navigateur via l'API Web Crypto.

  2. 2

    Saisir la clé secrète et définir son encodage

    Tapez ou collez votre clé secrète, puis réglez l'encodage de clé pour correspondre à la façon dont le serveur l'interprète : Texte (UTF-8) pour une chaîne ordinaire, Hex pour un bloc hexadécimal, ou Base64 pour un secret en base64. Se tromper ici est la première cause de désaccords HMAC, alors en cas de doute, essayez les trois.

  3. 3

    Saisir le message

    Collez les octets exacts que vous voulez signer — pour un webhook, c'est le corps brut de la requête, octet pour octet, sans re-sérialisation ni modification d'espaces. Le HMAC se recalcule en direct au fil de votre édition, sans rien envoyer à un serveur.

  4. 4

    Choisir le format de sortie et copier

    Sélectionnez Hex (façon GitHub), Base64 (façon Stripe/AWS) ou Base64URL (façon JWT) pour correspondre à ce qu'attend votre intégration, puis cliquez sur Copier pour récupérer la signature.

  5. 5

    Vérifier une signature existante

    Passez à l'onglet Vérifier, collez le HMAC attendu provenant d'un en-tête ou d'un jeton, et l'outil confirme en temps constant si votre signature calculée correspond — vous pouvez ainsi authentifier une charge utile avant d'agir.

Erreurs HMAC courantes

Mauvais encodage de clé (cause n°1 des non-correspondances)

Le même secret peut être lu comme du texte UTF-8 brut, comme de l'hex ou comme du base64 — et chaque interprétation produit des octets de clé totalement différents, donc le HMAC ne correspondra pas si votre outil et le serveur ne sont pas d'accord. Si un fournisseur vous donne un secret en hex ou en base64, vous devez le décoder en octets avant de signer, et non signer la chaîne telle quelle. Lorsqu'une signature échoue à se vérifier, essayez d'abord la clé avec les trois options d'encodage de clé.

✗ Incorrect
// Server stored a base64 secret but you sign the literal string
createHmac('sha256', 'c2VjcmV0LWtleQ==').update(msg)
✓ Correct
// Decode the base64 secret to raw bytes first
createHmac('sha256', Buffer.from('c2VjcmV0LWtleQ==', 'base64')).update(msg)

Mauvais encodage de sortie

Un HMAC est constitué d'octets bruts ; hex, base64 et base64url ne sont que des encodages texte différents de la même valeur. Si le serveur envoie une signature en base64 et que vous la comparez à votre condensé hex, ils ne correspondront jamais même si les octets sous-jacents sont identiques. Faites correspondre le format de sortie à ce qu'utilise l'en-tête ou le jeton.

✗ Incorrect
// Provider sends base64, you compare hex
expected = 'Cd2f7z...=' // base64
actual   = digest('hex') // hex — never matches
✓ Correct
// Produce the same encoding the provider uses
actual = digest('base64')

Signer un JSON re-sérialisé au lieu du corps brut

Les signatures de webhook couvrent les octets exacts que le fournisseur a envoyés. Si vous analysez le JSON puis le re-stringifiez, l'ordre des clés, l'espacement et le formatage des nombres peuvent changer, altérant les octets et cassant la signature. Faites toujours le HMAC sur le corps brut de la requête capturé avant toute analyse.

✗ Incorrect
// Re-serialization changes the bytes
body = JSON.stringify(JSON.parse(rawBody))
verify(hmac(body))
✓ Correct
// Sign the raw bytes exactly as received
verify(hmac(rawBody))

Utiliser == au lieu d'une comparaison en temps constant

Comparer la signature reçue avec == ou une simple égalité de chaînes révèle une information temporelle, car la comparaison s'arrête au premier octet différent. Au fil de nombreuses tentatives, un attaquant peut retrouver une étiquette valide. Utilisez toujours un contrôle d'égalité en temps constant lors de la vérification.

✗ Incorrect
if (received === computed) { /* trust */ }
✓ Correct
if (crypto.timingSafeEqual(receivedBuf, computedBuf)) { /* trust */ }

À quoi sert HMAC

Vérifier les signatures de webhook
Des fournisseurs comme GitHub, Stripe, Slack et Twilio signent chaque webhook avec un HMAC sur le corps de la requête et un secret que vous seul partagez. Recalculez l'étiquette et comparez-la à l'en-tête (par exemple X-Hub-Signature-256) pour confirmer que l'événement est authentique avant d'agir. Utilisez l'onglet Vérifier pour le faire sans écrire de code jetable.
Signer des requêtes d'API
Les API authentifiées exigent souvent que le client signe la requête par HMAC (méthode, chemin, horodatage, corps) avec un secret partagé plutôt que d'envoyer le secret lui-même. AWS Signature Version 4 en est l'exemple canonique. Cet outil vous permet de reproduire et déboguer ces signatures étape par étape.
Garantir l'intégrité des messages
Lorsque vous passez un jeton, un cookie ou un message entre des services, y attacher un HMAC permet au destinataire de détecter toute falsification. Comme l'étiquette dépend d'un secret, un attaquant ne peut pas la recalculer après avoir modifié les données — contrairement à une simple somme de contrôle.
Comprendre la signature HS256 des JWT
Un JWT signé avec HS256 est simplement base64url(en-tête) + '.' + base64url(charge utile), signé avec HMAC-SHA256 et le résultat émis en Base64URL. Réglez l'algorithme sur SHA-256 et la sortie sur Base64URL ici pour voir exactement comment cette signature est produite, puis vérifiez-la dans l'encodeur JWT.
Déboguer une signature qui ne correspond pas
Quand votre HMAC refuse de correspondre à celui du serveur, cet outil est le moyen le plus rapide d'isoler la cause : essayez la clé en Texte, Hex et Base64, basculez la sortie entre Hex et Base64, et confirmez que vous signez exactement les octets bruts — le tout sans redéployer de code.

Comment fonctionne HMAC

Construction RFC 2104
HMAC est défini par H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)), où ipad est l'octet 0x36 répété et opad l'octet 0x5c répété, tous deux à la taille de bloc du hash. Une clé plus longue que la taille de bloc est d'abord hachée ; une clé plus courte est complétée par des zéros. Cette imbrication à deux passes est ce qui confère à HMAC sa preuve de sécurité, laquelle tient même si le hash sous-jacent n'est pas résistant aux collisions.
Pourquoi un hash à clé l'emporte sur un hash simple
Un hash simple ne prouve que l'absence de corruption accidentelle des données, car n'importe qui peut le recalculer pour n'importe quel message — y compris un message falsifié. HMAC y mêle un secret, de sorte que seuls les détenteurs de la clé peuvent produire une étiquette valide. Cela transforme la simple intégrité en intégrité plus authenticité, qui est la propriété dont les webhooks et les requêtes signées ont réellement besoin.
Résistance à l'extension de longueur
Les SHA-1, SHA-256 et SHA-512 nus sont des hashs Merkle–Damgård vulnérables à l'extension de longueur : à partir de H(secret ‖ msg), un attaquant peut calculer H(secret ‖ msg ‖ extra) sans connaître le secret. Les schémas naïfs de « MAC à préfixe secret » sont cassés par cette attaque. Le hachage externe de HMAC neutralise l'attaque, ce qui est la principale raison d'utiliser HMAC plutôt que de hacher ensemble un secret et un message.
Choisir SHA-256 ou SHA-512
HMAC-SHA256 produit une étiquette de 256 bits (64 caractères hex) et constitue la valeur par défaut pour l'interopérabilité — rapide, omniprésente et prise en charge partout. HMAC-SHA512 produit une étiquette de 512 bits (128 caractères hex) et est souvent plus rapide sur les processeurs 64 bits, car SHA-512 utilise des mots de 64 bits. Choisissez SHA-256 sauf si une spécification ou un système pair exige SHA-512 ; les deux sont sûrs pour l'authentification.
Implémentation Web Crypto
Cet outil appelle crypto.subtle.importKey pour charger votre clé (décodée depuis Texte, Hex ou Base64) et crypto.subtle.sign('HMAC', ...) pour calculer l'étiquette, puis encode les octets bruts en Hex, Base64 ou Base64URL. C'est la même implémentation native et auditée que le navigateur utilise pour TLS, exécutée en dehors du moteur JavaScript pour plus de rapidité.

Bonnes pratiques HMAC

Utiliser une clé au moins aussi longue que la sortie du hash
Pour HMAC-SHA256, utilisez un secret d'au moins 32 octets aléatoires (256 bits) ; pour SHA-512, utilisez-en 64. Une clé courte ou à faible entropie est le maillon faible. Générez les clés depuis une source aléatoire cryptographiquement sûre — jamais un mot de passe ou une chaîne prévisible.
Toujours comparer les étiquettes en temps constant
Vérifiez les signatures avec une comparaison en temps constant (crypto.timingSafeEqual en Node, hmac.compare_digest en Python) plutôt qu'avec == ou l'égalité de chaînes. Une comparaison naïve s'arrête dès le premier octet différent, révélant un timing qui peut permettre à un attaquant de retrouver une étiquette valide octet par octet. L'onglet Vérifier de cet outil compare déjà en temps constant.
Ne jamais journaliser ni exposer la clé secrète
Tenez les secrets de signature hors des logs, des messages d'erreur, des URL et du code côté client. Stockez-les dans un gestionnaire de secrets ou des variables d'environnement, faites-les tourner périodiquement, et limitez chaque intégration à sa propre clé pour qu'une seule fuite ne compromette pas tout.
Préférer HMAC-SHA256 ou plus fort
Optez par défaut pour HMAC-SHA256 ; montez à SHA-384 ou SHA-512 quand un pair l'exige. Évitez HMAC-SHA1 pour les nouveaux systèmes et n'utilisez jamais HMAC-MD5. Même si HMAC tolère mieux un hash plus faible qu'une signature brute, partir d'un hash moderne vous donne la plus grande marge.
Signer les octets exacts, horodatage inclus
Signez la charge utile brute et non modifiée — re-sérialiser le JSON ou rogner les espaces change les octets et casse la vérification. Pour la signature de requêtes, incluez un horodatage ou un nonce dans les données signées et rejetez les signatures périmées pour prévenir les attaques par rejeu.

FAQ HMAC

Qu'est-ce qu'un HMAC ?
HMAC (Hash-based Message Authentication Code) est un moyen de prouver à la fois l'intégrité et l'authenticité d'un message à l'aide d'une clé secrète partagée. Vous passez un message et une clé secrète dans une fonction de hachage (ici SHA-1, SHA-256, SHA-384 ou SHA-512) selon la construction imbriquée spécifique définie par la RFC 2104, et vous obtenez une étiquette de longueur fixe. Quiconque connaît le secret peut recalculer l'étiquette et confirmer que le message n'a pas été altéré et provient de quelqu'un qui détient la clé. C'est le mécanisme standard derrière les signatures de webhook, les requêtes d'API signées et la famille HS256 des jetons JWT.
En quoi un HMAC diffère-t-il d'un simple hash comme SHA-256 ?
Un simple hash comme SHA-256 ne prouve que l'intégrité : n'importe qui peut le recalculer, donc n'importe qui peut aussi forger un hash correspondant pour un message falsifié. HMAC y mêle une clé secrète, de sorte que seules les parties détenant cette clé peuvent produire ou vérifier une étiquette valide — cela ajoute l'authenticité par-dessus l'intégrité. HMAC utilise aussi une construction imbriquée à deux passes (hachage interne et externe avec des pads dérivés de la clé) qui le rend immunisé contre les attaques par extension de longueur qui affectent les bruts SHA-1 et SHA-256. En bref : utilisez un hash pour détecter une corruption accidentelle, utilisez un HMAC pour détecter une falsification délibérée par un attaquant qui ne connaît pas votre clé.
Comment vérifier la signature d'un webhook entrant ?
Prenez le corps brut de la requête exactement tel qu'il a été reçu (ne re-sérialisez pas le JSON — même des clés réordonnées cassent la signature), sélectionnez le même algorithme que votre fournisseur (en général HMAC-SHA256), saisissez votre secret de signature avec le bon encodage de clé, et réglez le format de sortie pour qu'il corresponde à l'en-tête (Hex pour le préfixe sha256= de GitHub, Base64 pour les en-têtes façon Stripe/Twilio). Ouvrez ensuite l'onglet Vérifier, collez la signature de l'en-tête (comme X-Hub-Signature-256), et l'outil indique correspondance ou non à l'aide d'une comparaison en temps constant. Ne faites confiance à la charge utile que si elle correspond.
Quel encodage de clé et de sortie mon serveur utilise-t-il ?
Il n'y a pas de réponse universelle — cela dépend de votre fournisseur, ce qui est précisément la raison pour laquelle cet outil expose les deux comme des choix explicites. Schémas courants : GitHub utilise un secret texte UTF-8 et une sortie hex en minuscules avec un préfixe sha256= ; Stripe utilise un secret texte et du base64 ; AWS Signature V4 utilise des clés binaires dérivées et du hex ; de nombreux systèmes internes distribuent des secrets en base64 ou en hex qui doivent être décodés en octets bruts avant de signer. Si votre HMAC ne correspond pas, l'encodage en est presque toujours la cause — essayez la même clé en Texte, Hex et Base64 pour trouver l'interprétation attendue par le serveur.
HMAC-SHA256 est-il sûr ?
Oui. HMAC-SHA256 est largement considéré comme sûr et constitue la valeur par défaut recommandée pour l'authentification des messages. Sa sécurité vient de la construction HMAC associée à un hash sous-jacent robuste, et il reste sûr même si des attaques par collision existent contre le hash nu — HMAC ne repose pas sur la résistance aux collisions comme le fait une signature numérique. Les risques réels sont opérationnels, pas algorithmiques : une clé secrète faible ou divulguée, la journalisation de la clé, ou l'usage d'une comparaison qui n'est pas en temps constant. Utilisez une clé aléatoire longue et comparez les étiquettes en temps constant, et HMAC-SHA256 tiendra le coup.
Pourquoi pas de HMAC-MD5 ou HMAC-SHA-3 ici ?
C'est voulu. Cet outil n'expose que SHA-1, SHA-256, SHA-384 et SHA-512 parce que ce sont les fonctions de hachage prises en charge par l'API Web Crypto native du navigateur, ce qui garde tout rapide et entièrement côté client, sans bibliothèque supplémentaire. HMAC-MD5 est omis car MD5 est obsolète et vous ne devriez pas démarrer de nouveaux systèmes avec. HMAC-SHA-3 est omis car Web Crypto n'implémente pas SHA-3 ; l'ajouter nécessiterait d'embarquer un polyfill JavaScript. Pour pratiquement tous les cas d'usage modernes, HMAC-SHA256 est de toute façon le bon choix.
HS256 (HMAC) vs RS256 (RSA) — lequel utiliser pour les JWT ?
HS256 signe et vérifie un JWT avec un unique secret partagé via HMAC-SHA256, tandis que RS256 signe avec une clé privée RSA et vérifie avec la clé publique correspondante. Utilisez HS256 quand une seule partie à la fois émet et valide les jetons (un monolithe, ou des services internes de confiance qui peuvent partager le secret en toute sécurité) — c'est plus simple et plus rapide. Utilisez RS256 quand des tiers ou de nombreux services doivent vérifier les jetons sans pouvoir les forger, puisque vous pouvez ne distribuer que la clé publique. Vous pouvez explorer la structure encodée des deux dans l'encodeur JWT ; la signature HS256 est exactement un HMAC-SHA256 sur l'en-tête et la charge utile.