Un attaquant qui change simplement l’en-tête alg d’un jeton JWT de RS256 à HS256 peut, sur une bibliothèque mal configurée, forger un jeton valide en réutilisant la clé publique RSA comme secret HMAC. Ce scénario, documenté dans plusieurs CVE publiées en 2025 et 2026, résume à lui seul pourquoi la distinction entre HMAC et signature numérique n’est pas un détail académique. Elle détermine qui peut vérifier vos jetons, à quelle vitesse, et ce qui se passe le jour où une clé fuite. Cet article compare HMAC-SHA256 face à RSA, ECDSA et Ed25519 sur la performance, le coût réel chez les fournisseurs cloud, la sécurité et les cas d’usage, avec des chiffres sourcés et un guide de migration pour les équipes qui doivent trancher en 2026.
Qu’est-ce que HMAC ? Fonctionnement et cas d’usage typiques
HMAC signifie Hash-based Message Authentication Code. C’est un algorithme symétrique décrit par la RFC 2104 qui combine une fonction de hachage (SHA-256, SHA-384 ou SHA-512) avec une clé secrète partagée. Le même secret sert à générer le code d’authentification côté émetteur et à le vérifier côté récepteur. Concrètement, l’émetteur calcule HMAC(clé, message) et transmet ce tag avec le message. Le récepteur, qui connaît la même clé, recalcule le tag et le compare à celui reçu via une comparaison à temps constant, pour éviter les attaques par mesure de latence.
Cette architecture a un avantage direct : la vitesse. HMAC-SHA256 n’exécute que deux passes de la fonction de hachage sous-jacente, une opération que les processeurs modernes accélèrent nativement via les jeux d’instructions SHA-NI sur x86 ou les extensions crypto ARMv8. Un test 2026 mené sur Apple M4 Pro montre un débit SHA-256 matériel de 2,2 Go/s, ce qui donne une idée de la marge dont dispose HMAC face aux opérations asymétriques mesurées en microsecondes voire en millisecondes.
La contrepartie de cette rapidité, c’est l’absence de non-répudiation. Comme la même clé sert à signer et à vérifier, n’importe quel détenteur du secret peut forger un message valide. HMAC ne convient donc que lorsque l’émetteur et le vérificateur se font mutuellement confiance et partagent un canal sécurisé pour distribuer la clé. C’est exactement le modèle des webhooks : un service comme Stripe et le serveur du marchand partagent un secret unique par endpoint, sans tiers à convaincre.
Sur le plan de la construction, HMAC applique deux passes imbriquées de la fonction de hachage avec deux blocs dérivés de la clé, un padding interne et un padding externe, ce qui protège contre les attaques par extension de longueur qui touchent un simple hachage nu comme SHA256(clé + message). C’est cette construction en double passe, formalisée dans la RFC 2104, qui rend HMAC sûr même quand la fonction de hachage sous-jacente présente des faiblesses théoriques mineures. La taille de clé recommandée reste au moins égale à la taille de sortie du hachage, soit 32 octets pour SHA-256, générée par un générateur cryptographiquement sûr et jamais dérivée d’un mot de passe humain sans passer par une fonction de dérivation dédiée.
Les signatures numériques : RSA, ECDSA et Ed25519 en bref
Une signature numérique repose sur une paire de clés asymétriques. La clé privée reste chez le signataire et sert uniquement à signer. La clé publique peut circuler librement, y compris publiée sur un endpoint JWKS, et permet à n’importe qui de vérifier la signature sans jamais pouvoir en produire une nouvelle. Trois familles dominent le paysage actuel des API et des JWT.
RSA (algorithme RS256 en JOSE) reste le plus répandu dans les écosystèmes d’identité fédérée historiques. Sa sécurité repose sur la difficulté de factoriser de grands nombres premiers, ce qui impose des clés volumineuses (2048 bits minimum recommandé aujourd’hui) et des opérations de signature coûteuses en calcul. ECDSA (ES256) s’appuie sur les courbes elliptiques, en particulier P-256, et atteint un niveau de sécurité comparable à RSA-3072 avec une clé de seulement 256 bits. Ed25519, normalisé par la RFC 8032, pousse cette logique plus loin avec des clés fixes de 32 octets, des signatures déterministes et une résistance native à plusieurs classes d’attaques par canal auxiliaire qui ont historiquement touché des implémentations ECDSA mal conçues.
Le point commun de ces trois algorithmes : ils permettent une vérification décentralisée. Un fournisseur d’identité comme Auth0 ou Okta peut signer des millions de jetons avec une seule clé privée, pendant que des centaines de microservices, API gateways ou applications tierces vérifient ces jetons avec la clé publique correspondante, sans jamais avoir accès au secret de signature. C’est cette propriété, absente de HMAC, qui justifie leur adoption dans les architectures zero-trust et les flux OpenID Connect.
Ces trois familles ne s’excluent pas mutuellement dans une même infrastructure. Un opérateur TLS peut signer ses certificats en ECDSA pour la vitesse, pendant qu’un service d’archivage légal continue de s’appuyer sur RSA pour sa compatibilité avec des validateurs anciens, et qu’une équipe produit choisit Ed25519 pour ses nouveaux services internes. Le choix se fait projet par projet, en fonction de la durée de vie attendue du système et des contraintes de compatibilité héritées, plutôt que par une politique cryptographique unique imposée à toute l’organisation.
HMAC vs signature numérique : le tableau comparatif technique
Le tableau ci-dessous regroupe les caractéristiques techniques des quatre algorithmes les plus utilisés pour signer des API, des webhooks et des JWT en 2026.
| Critère | HMAC-SHA256 | RSA-2048 (RS256) | ECDSA P-256 (ES256) | Ed25519 (EdDSA) |
|---|---|---|---|---|
| Type de cryptographie | Symétrique (MAC) | Asymétrique | Asymétrique | Asymétrique |
| Norme de référence | RFC 2104 | PKCS#1 / FIPS 186-5 | FIPS 186-5 | RFC 8032 |
| Nombre de clés | 1 secret partagé | 2 (privée + publique) | 2 (privée + publique) | 2 (privée + publique) |
| Taille de clé recommandée | 256 bits (32 octets) | 2048 bits (256 octets) | 256 bits (32 octets) | 256 bits (32 octets) |
| Taille de la sortie | 32 octets (tag) | 256 octets | 64 octets (format JOSE R||S) | 64 octets |
| Non-répudiation | Non | Oui | Oui | Oui |
| Qui peut vérifier | Détenteur du secret uniquement | Toute partie avec la clé publique | Toute partie avec la clé publique | Toute partie avec la clé publique |
| Vitesse de signature | Très rapide (hachage) | Lente | Rapide | Très rapide |
| Vitesse de vérification | Identique à la signature | Plutôt rapide | Plus lente que la signature | Rapide |
| Algorithme JOSE (JWT) | HS256 / HS384 / HS512 | RS256 / RS384 / RS512 | ES256 / ES384 / ES512 | EdDSA |
| Cas d’usage typique | Webhooks, API interne | JWT fédérés, OIDC historique | JWT modernes, DNSSEC, TLS | SSH, Signal, JWT récents |
| Accélération matérielle courante | SHA-NI, ARMv8 Crypto Extensions | Rare hors HSM | Rare hors HSM | Logicielle, déjà très rapide |
Deux lignes méritent une attention particulière pour un architecte logiciel. D’abord, la taille de sortie : un JWT signé en RS256 embarque une signature de 256 octets contre 64 pour ES256 ou EdDSA, un écart qui compte dans un en-tête HTTP transmis à chaque requête d’une application mobile. Ensuite, la ligne « qui peut vérifier », qui est la vraie ligne de fracture architecturale entre HMAC et signature numérique, bien avant toute question de vitesse brute.
Benchmarks de performance : signature et vérification, les vrais chiffres
Les chiffres de performance varient fortement selon le matériel et l’implémentation testée, donc plutôt que de citer une moyenne générique, voici trois sources indépendantes publiées en 2025-2026, chacune avec son contexte matériel.
Sur serveur x86_64 : Cloudflare
Le benchmark officiel de Cloudflare pour son infrastructure Keyless SSL, mesuré sur une instance AWS c5.xlarge, donne des chiffres nets par cœur de processeur : plus de 10 000 opérations de signature ECDSA par seconde, contre environ 200 opérations de signature RSA-2048 par seconde. L’écart atteint donc un facteur 50 en faveur d’ECDSA sur ce banc d’essai en conditions réelles de production TLS.
Un second benchmark Cloudflare, publié en juillet 2026 sur la bibliothèque Go crypto, confirme la tendance avec des chiffres au niveau de la nanoseconde par opération. La signature ECDSA P-256 s’exécute en 48 741 ns (soit environ 20 500 opérations par seconde), contre 3 733 747 ns pour une signature RSA-2048, soit environ 268 opérations par seconde. Le ratio grimpe ici à 76x, un écart plus large que sur le banc d’essai Keyless SSL, ce qui illustre à quel point le choix de la bibliothèque cryptographique influence le résultat final.
Sur matériel contraint : SEGGER Knowledge Base
Le tableau de comparaison publié par SEGGER apporte une nuance nécessaire, avec des mesures de vérification (et non de signature) au niveau de sécurité 128 bits, soit RSA-3072 contre ECDSA P-256. Résultat : 15,89 ms pour vérifier une signature RSA-3072, contre 78,70 ms pour ECDSA P-256, soit un avantage de près de 5x pour RSA en vérification sur ce matériel. Cette source concerne du matériel embarqué contraint, pas des serveurs cloud, mais elle confirme une règle générale valable aussi sur serveur : RSA signe lentement mais vérifie relativement vite, ECDSA signe très vite mais vérifie plus lentement que sa propre opération de signature.
Pour HMAC-SHA256, il n’existe pas de vérification distincte puisque l’opération consiste simplement à recalculer le même hachage. Sur un processeur doté d’instructions SHA-NI, ce calcul se mesure en dizaines de nanosecondes, un ordre de grandeur largement inférieur à toute opération asymétrique. C’est cette différence structurelle, et non un simple avantage d’implémentation, qui explique pourquoi HMAC reste le choix par défaut dès que la performance brute prime sur la vérification décentralisée.
Ces trois sources ne se contredisent pas, elles mesurent des couches différentes. Le banc Keyless SSL de Cloudflare et son benchmark Go crypto tournent sur des serveurs x86_64, avec des résultats en dizaines de milliers d’opérations par seconde. Le tableau SEGGER, lui, tourne sur du matériel embarqué nettement moins puissant, avec des résultats en millisecondes. La leçon à retenir pour un architecte : ne jamais comparer un chiffre issu d’un serveur cloud à un chiffre issu d’un microcontrôleur sans vérifier le contexte matériel, sous peine de tirer la mauvaise conclusion sur l’algorithme à privilégier.
Tailles de clés, de signatures et impact réseau
Au-delà de la vitesse de calcul, la taille des artefacts cryptographiques a un coût réseau concret, surtout pour des jetons JWT envoyés à chaque appel API. Une clé privée RSA-2048 pèse entre 1,7 et 2,4 Ko selon l’encodage, contre 32 octets pour une clé Ed25519 ou une clé privée ECDSA P-256. Côté clé publique, RSA-2048 occupe environ 270 à 300 octets en DER, contre 32 octets pour Ed25519 et 64 octets pour une clé ECDSA non compressée.
La différence se répercute directement sur la taille du jeton final. Une signature RSA-2048 fait 256 octets, quatre fois la taille d’une signature ECDSA ou Ed25519 au format JOSE (64 octets), et huit fois celle d’un tag HMAC-SHA256 (32 octets). Sur une application mobile qui envoie des milliers de requêtes authentifiées par session, la différence entre un en-tête Authorization de 300 octets et un en-tête de 700 octets finit par peser sur la consommation de données, en particulier sur des réseaux mobiles en zone rurale où la bande passante reste limitée en Europe.
Ce facteur explique en partie pourquoi les nouvelles implémentations JWT publiées en 2025-2026, notamment côté frameworks JavaScript et Go, poussent vers ES256 ou EdDSA plutôt que RS256 par défaut. Les gains ne se limitent pas à la vitesse de signature : ils touchent aussi le volume de données transmises à grande échelle.
Combien ça coûte ? AWS KMS, Google Cloud KMS et Azure Key Vault
Peu d’articles techniques sur HMAC et les signatures numériques abordent le coût de gestion des clés en production, pourtant c’est souvent ce qui tranche le débat en entreprise. Les trois grands fournisseurs cloud publient des grilles tarifaires qui traitent différemment les clés symétriques et asymétriques.
| Fournisseur | Clé symétrique (HMAC) | Clé RSA-2048 | Clé RSA-3072/4096 ou ECDSA avancée | Coût des opérations |
|---|---|---|---|---|
| AWS KMS | 1 $ / mois / clé | 1 $ / mois / clé | 1 $ / mois / clé | 0,03 $/10 000 (symétrique + RSA-2048), 0,15 $/10 000 (autres asymétriques) |
| Google Cloud KMS | 0,06 $ / mois / version de clé | 0,06 $ / mois / version de clé | 0,06 $ de base, majoré au-delà de 2 000 versions actives | 0,03 $/10 000 (symétrique + RSA-2048), 0,15 $/10 000 (RSA-3072/4096, ECC) |
| Azure Key Vault (HSM Premium) | Non proposé en clé HSM native | 1 $ / mois + 0,03 $/10 000 transactions | 5 $ / mois pour les 250 premières clés, puis dégressif | 0,03 $/10 000 (RSA-2048), 0,15 $/10 000 (types avancés) |
Le détail qui surprend le plus d’équipes FinOps : chez AWS et Google Cloud, une clé symétrique HMAC et une clé RSA-2048 coûtent exactement le même prix au mois et à l’appel. Le surcoût n’apparaît que pour les clés asymétriques avancées, RSA-3072, RSA-4096 ou ECDSA, facturées cinq fois plus cher par opération chez les deux fournisseurs. Concrètement, migrer d’un HMAC interne géré manuellement vers une clé RSA-2048 hébergée en KMS n’entraîne quasiment aucun surcoût direct de gestion de clé, seul le volume d’opérations de signature et de vérification change la facture.
À l’inverse, une architecture zero-trust qui déploie des centaines de clés ECDSA par service, une par microservice ou par tenant, peut voir sa facture Azure Key Vault grimper vite. Au-delà de 250 clés avancées, chaque clé continue de coûter entre 0,40 $ et 2,50 $ par mois selon le palier, en plus des transactions. Pour les équipes qui gèrent des dizaines de milliers de clés, HashiCorp Vault en mode self-hosted, gratuit en édition Community, reste une alternative sérieuse aux KMS managés facturés à la clé.
Cas d’usage réels : qui utilise quoi en production
HMAC en production : Stripe, GitHub, Shopify
Stripe documente explicitement son choix d’HMAC pour la vérification des webhooks. La documentation officielle de Stripe précise que la plateforme génère les signatures avec un HMAC-SHA256, calculé sur la concaténation d’un timestamp et du corps brut de la requête, en utilisant le secret de signature propre à chaque endpoint. Le serveur marchand recalcule ce HMAC et compare le résultat en temps constant au contenu de l’en-tête Stripe-Signature, avec une fenêtre de tolérance sur le timestamp pour bloquer les attaques par rejeu.
GitHub suit exactement le même schéma pour ses webhooks, avec un en-tête X-Hub-Signature-256 contenant un HMAC-SHA256 calculé sur le corps brut avec le secret configuré dans les paramètres du webhook. Shopify applique le même principe via l’en-tête X-Shopify-Hmac-SHA256, encodé en base64. Dans les trois cas, le modèle reste identique : un émetteur et un récepteur uniques, un secret partagé, aucun besoin de distribuer une clé publique à des tiers.
Signatures asymétriques : Auth0, Okta et l’écosystème OIDC
À l’opposé, les fournisseurs d’identité fédérée privilégient les signatures asymétriques. La documentation Okta pour la validation des jetons d’accès décrit un flux où le fournisseur signe les jetons avec sa clé privée et publie ses clés publiques sur un endpoint JWKS, que chaque API consommatrice interroge pour vérifier la signature sans jamais partager de secret avec Okta. Auth0 applique la même logique avec RS256 comme algorithme par défaut sur ses jetons OIDC, et propose ES256 pour les intégrations qui veulent réduire la taille des jetons.
Cette architecture répond à un besoin que HMAC ne peut pas couvrir : des dizaines, parfois des centaines de microservices indépendants doivent vérifier des jetons émis par un seul fournisseur d’identité, sans qu’un seul de ces services ne puisse forger de faux jetons pour les autres. C’est le cœur du modèle zero-trust, où la compromission d’un vérificateur ne doit jamais compromettre l’émetteur.
Les failles de sécurité : attaques par confusion d’algorithme JWT
La classe de vulnérabilité la plus documentée en 2025-2026 autour de HMAC et des signatures numériques ne vient pas d’une faiblesse cryptographique des algorithmes eux-mêmes, mais d’une erreur d’implémentation récurrente appelée confusion d’algorithme, ou alg confusion. Le principe : un serveur configuré pour vérifier des jetons RS256 fait confiance au champ alg déclaré dans l’en-tête du JWT plutôt que d’imposer l’algorithme attendu. Un attaquant modifie ce champ en HS256, puis calcule un HMAC en utilisant la clé publique RSA du serveur comme secret, ce qui produit une signature que le serveur mal configuré accepte comme valide.
Plusieurs incidents concrets illustrent ce schéma. La CVE-2025-68925, publiée début 2026, touche la bibliothèque Jervis utilisée par des scripts Jenkins Job DSL et des bibliothèques de pipelines partagées. La vérification ne s’assurait pas que le champ alg valait bien RS256, ouvrant la voie à une confusion classique. Le correctif est arrivé en version 2.2. Un rapport 2026 de GraphNode Software détaille des cas similaires et insiste sur une règle simple : imposer explicitement une liste d’algorithmes autorisés côté vérificateur, sans jamais laisser la bibliothèque choisir l’algorithme à partir de l’en-tête reçu.
Côté Node.js, une analyse publiée par AhnLab ASEC montre que les bibliothèques jsonwebtoken (avant la version 4.2.2) et json-web-token (avant la 3.1.1) acceptaient des jetons signés en HMAC alors qu’elles devaient valider du RSA ou de l’ECDSA, un cas d’école de confusion HS/RS. Une advisory GitHub sur la bibliothèque cjwt décrit un défaut de conception comparable en C, où le type de clé n’était pas strictement lié à l’algorithme déclaré. Plus récemment, début 2026, trois CVE distinctes (2026-22817, 2026-27804 et 2026-23552) ont touché le middleware JWT du framework Hono pour la même raison : l’algorithme de vérification était dérivé de l’en-tête du jeton plutôt que d’être imposé côté serveur.
Un rapport de synthèse publié par Red Sentry fin 2025 recense encore d’autres CVE dans la même famille, dont une confusion liée à la récupération de clé publique ECDSA permettant de forger des jetons. Le point commun de tous ces incidents n’est pas la faiblesse mathématique de HMAC, RSA ou ECDSA, mais la frontière floue que certaines bibliothèques laissent entre familles symétriques et asymétriques.
Recommandations OWASP, IETF et bonnes pratiques 2026
Les guides de sécurité alignés sur les pratiques OWASP convergent vers un jeu de règles simple à appliquer, quel que soit le langage backend utilisé.
- Toujours passer une liste explicite d’algorithmes autorisés (
algorithms: ["RS256"]par exemple) au moment de vérifier un jeton, sans jamais laisser la bibliothèque déduire l’algorithme depuis l’en-tête reçu. - Désactiver purement et simplement l’algorithme
none, qui ne devrait jamais atteindre le code de vérification en production. - Séparer strictement les magasins de clés symétriques et asymétriques, pour qu’une clé publique RSA ne puisse jamais être interprétée comme un secret HMAC par erreur de typage.
- Utiliser un champ
kid(key ID) dans l’en-tête JWT pour permettre la rotation de clés sans interruption de service, en particulier avec les JWKS des fournisseurs OIDC. - Réserver HMAC aux échanges où l’émetteur et le vérificateur sont sous contrôle opérationnel commun, typiquement les webhooks et les appels API internes à un même domaine de confiance.
La RFC 7519, qui définit le format JWT, et la RFC 7518, qui liste les algorithmes JOSE dont HS256, RS256, ES256 et EdDSA, restent les références normatives que les bibliothèques doivent implémenter à la lettre. La RFC 2104 encadre HMAC lui-même, avec des recommandations claires sur la longueur minimale de clé, au moins égale à la taille de sortie du hachage utilisé.
La rotation de clés mérite un traitement à part, car c’est souvent le maillon faible en production. Pour HMAC, changer de secret oblige à coordonner émetteur et récepteur au même instant, ou à accepter temporairement deux secrets valides en parallèle, ce qui complique l’automatisation. Pour une signature asymétrique, la rotation se fait côté émetteur seul : publier une nouvelle clé publique sur le JWKS avec un nouveau kid, laisser l’ancienne clé disponible le temps que les jetons déjà émis expirent, puis la retirer. Cette asymétrie opérationnelle pèse autant que la performance brute dans le choix final, surtout pour des équipes qui doivent tourner leurs clés tous les 90 jours par politique de sécurité interne.
Quand choisir HMAC : 4 cas d’usage concrets
HMAC reste le bon choix par défaut dans quatre situations précises, qui reviennent constamment dans les architectures européennes en 2026.
- Vérification de webhooks entrants : un seul émetteur (Stripe, un partenaire de paiement, un CRM) et un seul récepteur, avec un secret configuré une fois par endpoint. C’est le modèle le plus courant et le mieux documenté.
- API interne entre microservices d’un même domaine de confiance : quand toutes les parties appartiennent à la même organisation et partagent déjà un coffre-fort de secrets (Vault, Secrets Manager), le surcoût de gestion de clés publiques n’apporte rien.
- Systèmes à très fort volume de requêtes : les files de messages internes, les pipelines de traitement de flux ou les API à des millions de requêtes par seconde profitent directement de la rapidité de calcul d’HMAC.
- Environnements à ressources contraintes sans besoin de vérification tierce : capteurs IoT propriétaires qui ne dialoguent qu’avec leur propre passerelle, où la simplicité d’implémentation compte autant que la performance.
Quand choisir une signature numérique : 4 cas d’usage concrets
À l’inverse, une signature asymétrique s’impose dès que la vérification doit sortir du périmètre de l’émetteur.
- Authentification fédérée et SSO : jetons OIDC émis par Auth0, Okta ou Keycloak et vérifiés par des dizaines de services indépendants via une clé publique JWKS.
- API publiques ouvertes à des développeurs tiers : quand des clients externes doivent pouvoir vérifier l’authenticité d’une réponse sans jamais détenir de secret de votre organisation.
- Architectures zero-trust multi-tenant : la compromission d’un seul microservice vérificateur ne doit jamais permettre de forger de faux jetons pour l’ensemble du système, une garantie qu’HMAC ne peut pas offrir.
- Applications mobiles et clients distribués : le client ne doit jamais embarquer de secret de signature, seule une clé publique, sans danger si elle fuite, peut résider côté client.
Avantages et inconvénients : le match HMAC contre RSA/ECDSA/Ed25519
HMAC-SHA256, avantages : rapidité de calcul inégalée, taille de sortie minimale (32 octets), implémentation simple sans gestion de paire de clés, support natif dans quasiment tous les langages et frameworks web depuis quinze ans.
HMAC-SHA256, inconvénients : aucune non-répudiation, distribution du secret risquée dès que plus de deux parties sont impliquées, une seule fuite de clé compromet à la fois la capacité d’émettre et de vérifier, rotation de clé plus délicate à orchestrer sans interruption.
RSA-2048, avantages : écosystème mature, support quasi universel dans les bibliothèques historiques, vérification relativement rapide malgré une signature lente.
RSA-2048, inconvénients : clés et signatures volumineuses (256 octets de signature), signature très lente comparée à ECDSA ou Ed25519, coût en calcul par opération plus élevé en KMS managé au-delà de RSA-2048.
ECDSA P-256, avantages : signature très rapide, clés compactes (32 octets), largement supporté par les frameworks JWT modernes et par TLS, bon compromis pour les nouveaux déploiements.
ECDSA P-256, inconvénients : vérification plus lente que RSA à niveau de sécurité comparable, historique d’implémentations vulnérables aux attaques par canal auxiliaire quand la génération de nonce est mal codée, complexité d’implémentation plus élevée que RSA ou Ed25519.
Ed25519, avantages : signatures rapides à générer et à vérifier, clés fixes et minimales, conception déterministe qui élimine la classe de bugs liée à la génération de nonce en ECDSA, adoption croissante en 2026 dans SSH, Signal et les nouvelles bibliothèques JWT.
Ed25519, inconvénients : support encore incomplet dans certains anciens fournisseurs d’identité ou HSM legacy, écosystème de tooling plus jeune que RSA, moins de compatibilité descendante avec des systèmes conçus avant 2018.
Guide de migration : passer de HMAC à une signature asymétrique
Migrer une API en production d’HMAC vers une signature asymétrique, ou l’inverse, se fait sans coupure de service à condition de suivre une séquence progressive plutôt qu’un basculement brutal.
- Générer la nouvelle paire de clés (ou le nouveau secret HMAC) et lui attribuer un identifiant
kiddistinct de l’ancien. - Déployer le vérificateur en mode double : accepter simultanément les jetons signés avec l’ancien algorithme et le nouveau, en lisant le
kidpour choisir la clé de vérification correspondante. - Publier la nouvelle clé publique sur l’endpoint JWKS existant, en conservant l’ancienne clé le temps de la transition, jamais l’inverse.
- Basculer progressivement l’émission de nouveaux jetons vers le nouvel algorithme, service par service si l’architecture le permet, en surveillant les taux d’erreur de vérification.
- Fixer une date de fin de vie pour l’ancien algorithme, correspondant à la durée de vie maximale d’un jeton déjà émis, typiquement l’expiration la plus longue configurée côté émission.
- Retirer l’ancienne clé de vérification une fois la fenêtre écoulée, et supprimer le support de l’ancien algorithme côté code pour fermer définitivement la porte à une confusion d’algorithme résiduelle.
- Documenter le changement dans le changelog public de l’API si des consommateurs tiers vérifient vos jetons, avec un préavis d’au moins 30 jours.
Le point de vigilance principal pendant cette transition concerne justement les attaques par confusion d’algorithme décrites plus haut. Le code de vérification en mode double doit impérativement lier chaque kid à un algorithme et un type de clé fixes, jamais accepter n’importe quel algorithme déclaré dans le jeton lui-même. C’est précisément l’erreur qui a produit les CVE Hono et Jervis citées dans cet article.
Le verdict : quel algorithme pour votre architecture en 2026 ?
Il n’existe pas de vainqueur universel entre HMAC et signature numérique, seulement un bon choix par contexte. Pour des webhooks et des API internes à un seul domaine de confiance, HMAC-SHA256 reste imbattable en performance, jusqu’à 50 à 76 fois plus rapide qu’une signature RSA-2048 selon les benchmarks Cloudflare cités plus haut, et en simplicité opérationnelle, à condition d’accepter qu’un seul secret partagé gouverne toute la relation de confiance.
Pour tout ce qui touche à l’authentification fédérée, aux API publiques ou aux architectures zero-trust, la question n’est plus de savoir si une signature asymétrique s’impose, mais laquelle. ECDSA P-256 offre le meilleur compromis actuel entre vitesse de signature, taille de clé et compatibilité avec l’écosystème JWT existant. Ed25519 progresse vite et mérite d’être le choix par défaut sur tout nouveau projet sans contrainte de compatibilité descendante, grâce à sa résistance structurelle aux bugs d’implémentation qui ont historiquement affecté ECDSA. RSA-2048 garde sa place dans les systèmes existants où la migration coûterait plus cher que le gain de performance, en particulier quand la vérification prime sur la signature.
Côté coût, la surprise de cet article tient aux grilles tarifaires d’AWS et de Google Cloud : une clé HMAC et une clé RSA-2048 coûtent le même prix en KMS managé. Le vrai surcoût n’apparaît qu’avec les clés asymétriques avancées, RSA-3072/4096 et ECDSA hors RSA-2048, facturées cinq fois plus cher par opération chez les deux fournisseurs. Le calcul économique ne doit donc jamais être le facteur décisif isolé : la surface d’attaque et le modèle de confiance de votre architecture doivent primer, le budget suit ensuite.
Pour trancher rapidement sans relire tout l’article, le tableau ci-dessous résume la recommandation par situation.
| Votre situation | Recommandation |
|---|---|
| Vérifier des webhooks d’un fournisseur externe (paiement, CRM) | HMAC-SHA256, un secret par endpoint |
| Appels entre microservices d’une même équipe | HMAC-SHA256 via un coffre-fort de secrets partagé |
| JWT pour une application web ou mobile mono-tenant | ECDSA P-256 (ES256) pour le meilleur compromis vitesse/taille |
| SSO fédéré avec plusieurs fournisseurs de services | RS256 ou ES256, avec rotation de clés via JWKS et kid |
| Nouveau projet sans contrainte de compatibilité descendante | Ed25519 (EdDSA) par défaut |
| Système legacy déjà en RSA sans budget de migration | Rester en RSA-2048, ne pas migrer sans raison de sécurité |
Questions fréquentes sur HMAC et les signatures numériques
HMAC et signature numérique, c’est la même chose ?
Non. HMAC est une opération symétrique où la même clé sert à signer et à vérifier. Une signature numérique (RSA, ECDSA, Ed25519) utilise une paire clé privée/clé publique, où seule la clé privée signe et n’importe qui peut vérifier avec la clé publique.
Faut-il utiliser HS256 ou RS256 pour des JWT en 2026 ?
Cela dépend du nombre de vérificateurs. Si un seul serveur émet et vérifie les jetons, HS256 suffit et reste plus rapide. Dès que plusieurs services indépendants doivent vérifier les mêmes jetons, RS256 ou ES256 s’imposent pour éviter de distribuer un secret partagé à tout le monde.
Qu’est-ce qu’une attaque par confusion d’algorithme JWT ?
C’est une faille où un serveur configuré pour vérifier des jetons RS256 accepte à tort un jeton signé en HS256, en utilisant sa clé publique RSA comme secret HMAC. Elle touche les bibliothèques qui déduisent l’algorithme de vérification depuis l’en-tête du jeton reçu au lieu de l’imposer côté serveur.
HMAC-SHA256 est-il toujours sûr en 2026 ?
Oui, HMAC-SHA256 reste considéré comme sûr avec une clé d’au moins 256 bits générée aléatoirement. Les incidents documentés en 2025-2026 viennent d’erreurs de configuration côté vérification, pas d’une faiblesse mathématique de l’algorithme lui-même.
RSA ou ECDSA pour signer des JWT en 2026 ?
ECDSA P-256 (ES256) offre une signature nettement plus rapide et des jetons plus légers que RSA-2048. RSA garde un léger avantage en vitesse de vérification pure et une compatibilité plus large avec d’anciens systèmes qui ne supportent pas encore ECDSA ou Ed25519.
Comment migrer de HMAC vers une signature asymétrique sans coupure ?
En déployant d’abord le vérificateur en mode double, capable d’accepter les deux algorithmes via un identifiant kid, puis en basculant progressivement l’émission de nouveaux jetons avant de retirer l’ancien algorithme une fois tous les jetons existants expirés.
Quel est le coût réel de la gestion de clés HMAC vs RSA/ECDSA en cloud ?
Chez AWS KMS et Google Cloud KMS, une clé HMAC et une clé RSA-2048 coûtent le même prix, environ 1 $ par mois chez AWS ou 0,06 $ par version de clé chez Google Cloud. Le surcoût n’apparaît que pour les clés asymétriques avancées (RSA-3072/4096, ECDSA), facturées jusqu’à cinq fois plus cher par opération.
Peut-on combiner HMAC et signature numérique dans la même architecture ?
Oui, c’est même la pratique la plus courante en 2026 : HMAC pour les webhooks entrants et les appels internes entre microservices d’un même domaine de confiance, signature asymétrique pour l’authentification fédérée et les API exposées à des tiers.
Related Coverage
- ECDSA vs RSA : Signatures 9,5x Plus Rapides [2026]
- HMAC-SHA256 en Node.js : signer une API en 12 étapes [2026]
- Authentification JWT en Node.js : 12 étapes [2026]
- Signatures numériques : comment le hachage et les clés garantissent l’authenticité
- TLS 1.3 vs TLS 1.2 : 40 % plus rapide, 5 CVE [2026]
- Kyber vs Dilithium : 1 Ko vs 3,3 Ko, le duel PQC [2026]




