MiServe DevTools

Vos autocollants

Épinglez vos outils ici. Ils sont enregistrés dans ce navigateur.

Générateur HMAC

Signez un message avec une clé secrète en HMAC-SHA256 ou avec un autre hachage, et vérifiez une signature reçue.

HMAC (hex)
HMAC (Base64)

S'exécute dans votre navigateur avec WebAssembly. Rien de ce que vous collez n'est envoyé.

À propos de cet outil

Ce que prouve un HMAC

HMAC (RFC 2104) combine un message et une clé secrète à travers une fonction de hachage et renvoie un code court, appelé tag. Quiconque détient la même clé peut recalculer ce tag. Si les deux tags sont égaux, le message n'a pas été modifié en route (intégrité) et il a été produit par quelqu'un qui connaît la clé (authenticité).

Un simple hachage ne le permet pas, car quiconque modifie le message peut aussi recalculer son hachage. Un HMAC ne masque pas le message : ce n'est donc pas du chiffrement. Et comme les deux parties détiennent la même clé, il ne permet pas de savoir laquelle des deux a écrit le message. Pour cela, il faut une signature numérique avec une clé privée.

Signatures de webhooks

On rencontre souvent HMAC dans les webhooks. Le fournisseur signe le corps de la requête avec un secret partagé avec vous et envoie le tag dans un en-tête, et votre serveur calcule le même HMAC avant de faire confiance à la requête. GitHub envoie X-Hub-Signature-256: sha256=… en hex, Shopify envoie X-Shopify-Hmac-SHA256 en Base64, et Stripe signe le timestamp, un point et le corps, puis envoie le résultat sous la forme v1=… dans Stripe-Signature.

Signez les octets bruts du corps, exactement tels qu'ils sont arrivés. Si un framework analyse le JSON et que vous le sérialisez de nouveau, les espaces et l'ordre des clés changent, et le HMAC ne correspond plus. Quand une signature échoue ici, regardez d'abord l'encodage de la clé (texte, hex ou Base64), puis un éventuel saut de ligne à la fin du message.

Pourquoi un serveur compare en temps constant

Une comparaison de chaînes ordinaire s'arrête au premier caractère différent. Sur un serveur, la réponse est donc un peu plus rapide quand les premiers octets d'une signature falsifiée sont faux, et un peu plus lente quand ils sont justes : un attaquant capable de mesurer cet écart peut reconstituer un tag valide octet par octet. Une comparaison en temps constant lit tous les octets, quel que soit le résultat. Utilisez la fonction fournie par votre plateforme : crypto.timingSafeEqual en Node.js, hmac.Equal en Go, hmac.compare_digest en Python, hash_equals en PHP.

Le champ de comparaison de cette page fonctionne de la même façon : il décode les deux valeurs en octets et les lit tous. Dans un onglet qui contient déjà les deux valeurs, il n'y a aucun temps de réponse à masquer : ici, il vous dit seulement si votre propre code a produit le bon tag.

Comment il fonctionne

Le tag est calculé par le package crypto/hmac de Go, compilé en WebAssembly et exécuté dans un thread d'arrière-plan de votre navigateur. Le message est pris en UTF-8, sans rien ajouter ni retirer. Une seule chose change : un champ de texte de navigateur conserve chaque saut de ligne sous forme d'un simple LF, si bien qu'un message arrivé avec des fins de ligne CRLF est signé ici avec des LF. La clé est prise comme texte UTF-8, ou décodée depuis l'hex ou le Base64 si vous l'indiquez. Ni l'un ni l'autre n'est envoyé nulle part. Mieux vaut tout de même ne pas coller un secret de production dans une page web : utilisez une clé de test quand c'est possible.

Questions

Pourquoi mon HMAC diffère-t-il de celui calculé par mon serveur ?

Les causes habituelles sont une clé lue dans le mauvais encodage (une clé hex ou Base64 traitée comme du texte brut), un saut de ligne final ou des fins de ligne différentes dans le message, un corps analysé puis sérialisé de nouveau, ou un autre algorithme de hachage. Vérifiez aussi si l'autre côté affiche de l'hex ou du Base64.

Un HMAC revient-il à hacher la clé suivie du message ?

Non. Avec SHA-256, SHA-512, SHA-1 ou MD5, le hachage de la clé suivie du message peut être étendu : quelqu'un qui voit le hachage peut ajouter des données et calculer un hachage valide sans connaître la clé. HMAC hache deux fois avec deux clés dérivées, ce qui ferme cette brèche.

Quelle longueur doit avoir une clé HMAC ?

Utilisez une clé aléatoire au moins aussi longue que la sortie du hachage : 32 octets pour SHA-256, 64 octets pour SHA-512. Une clé plus longue apporte peu, et une clé plus longue que la taille de bloc du hachage est d'abord hachée. Une clé courte ou facile à deviner peut être retrouvée en testant des clés candidates sur un seul couple message/tag connu.

HMAC-SHA1 et HMAC-MD5 sont-ils cassés ?

Les attaques par collision qui ont cassé SHA-1 et MD5 en tant que simples hachages ne se traduisent pas par une falsification pratique de leurs HMAC. On les trouve encore dans d'anciens protocoles, mais pour tout nouveau projet, choisissez HMAC-SHA256 ou plus robuste.

Autres outils de la catégorie Hachage