Aller au contenu principal
Expert Cybersécurité & IAv9.0
Centres de ressources conformité
Besoin d'un accompagnement expert ?
Devis personnalisé sous 24h — audit, conformité, incident
Checklists Sécurité — Audit & Durcissement
Formats disponibles
📄 PDF 📊 Excel 🌐 Web

11 checklists professionnelles couvrant 2 200+ points de contrôle. Téléchargement gratuit, aucune inscription.

HMAC (Hash-based Message Authentication Code)

general

Définition

Le HMAC (Hash-based Message Authentication Code) est un mécanisme qui combine une fonction de hachage cryptographique avec une clé secrète pour produire un code d'authentification de message. Contrairement à un simple hash, un HMAC prouve à la fois l'intégrité des données (elles n'ont pas été modifiées) et leur authenticité (elles ont été créées par quelqu'un possédant la clé secrète). La construction du HMAC suit la formule : HMAC(K, m) = H((K ⊕ opad) || H((K ⊕ ipad) || m)), où H est la fonction de hachage, K la clé secrète, m le message, et opad/ipad des constantes. Cette double imbrication protège contre certaines attaques structurelles sur les hash simples, notamment les attaques par extension de longueur qui affectent SHA-256 et SHA-512 utilisés directement. Le HMAC est omniprésent dans les protocoles de sécurité modernes. Dans TLS, le HMAC est utilisé avec SHA-256 ou SHA-384 pour l'intégrité des enregistrements (en mode CBC — TLS 1.2 et antérieur). Dans les JWT (JSON Web Tokens), l'algorithme HS256 est HMAC-SHA-256, permettant de vérifier que le token n'a pas été modifié et a été émis par une entité connaissant la clé secrète. Dans les API REST, les signatures HMAC (comme AWS Signature Version 4, GitHub webhooks, Stripe webhook signatures) permettent de vérifier que les requêtes proviennent de sources légitimes. Les limites du HMAC à clé symétrique incluent le fait que quiconque possède la clé peut à la fois créer et vérifier des MACs — il ne fournit pas de non-répudiation. Pour la non-répudiation, les signatures numériques asymétriques (ECDSA, EdDSA) sont nécessaires. Les algorithmes recommandés actuellement sont HMAC-SHA-256 (minimum) et HMAC-SHA-384/512 pour les applications haute sécurité. HMAC-MD5 et HMAC-SHA-1 sont obsolètes mais encore présents dans des systèmes legacy — une migration est nécessaire. La gestion sécurisée de la clé HMAC (génération aléatoire, longueur suffisante ≥ 256 bits, rotation régulière) est aussi critique que l'algorithme lui-même.

HMAC dans les JWT et les API sécurisées

Les JSON Web Tokens (JWT) peuvent être signés avec HMAC-SHA256 (HS256) ou HMAC-SHA512 (HS512). Dans ce mode, la clé secrète doit être partagée entre l'émetteur et tous les vérificateurs — ce qui peut être problématique dans les architectures multi-services. La compromission d'un service vérificateur compromet la clé de signature globale. Pour cette raison, les architectures OAuth 2.0 modernes privilégient les signatures asymétriques RS256 (RSA) ou ES256 (ECDSA) qui permettent à l'émetteur de garder la clé privée secrète tout en publiant la clé publique pour vérification. Une vulnérabilité classique des implémentations JWT est l'acceptation de l'algorithme "none" — toujours valider explicitement l'algorithme attendu.

HMAC dans les signatures d'API (AWS, GitHub, Stripe)

Les webhooks et les API REST utilisent souvent HMAC pour vérifier l'authenticité des requêtes. GitHub signe ses payloads webhook avec HMAC-SHA256 en utilisant le secret configuré ; le receveur doit recalculer la signature et la comparer via une comparaison à temps constant (timing-safe comparison) pour éviter les attaques timing. AWS Signature Version 4 utilise une dérivation de clé HMAC hiérarchique (date, région, service, signing key) pour signer les requêtes API AWS. Ces implémentations montrent l'usage pratique du HMAC pour l'authentification des API sans certificats ni PKI.

Comparaison à temps constant — protection contre les timing attacks

La comparaison des HMAC doit impérativement utiliser une comparaison à temps constant (constant-time comparison). Une comparaison naïve (==, strcmp) s'arrête au premier byte différent, ce qui révèle via le temps d'exécution combien de bytes sont corrects — une timing attack permet de reconstituer le HMAC attendu byte par byte. Les langages modernes proposent des fonctions dédiées : hmac.compare_digest en Python, crypto.timingSafeEqual en Node.js, hash_equals en PHP, MessageDigest.isEqual en Java. Cette vulnérabilité, souvent oubliée par les développeurs, a causé des failles de sécurité réelles dans des implémentations de webhooks.

Articles liés

Un projet cybersécurité ?

Expert dispo · Réponse 24h

Devis