Codes d'authentification de message (MAC et HMAC)
Portail > Intégrité et authentification
Un code d'authentification de message (MAC) est une étiquette calculée avec une clé secrète, qui prouve qu'un message n'a pas été modifié (intégrité) et provient bien d'un détenteur de la clé (authenticité). C'est le complément indispensable du chiffrement, qui seul n'assure pas l'intégrité.
Principe
L'émetteur calcule tag = MAC(K, message) et le joint au message. Le destinataire recalcule le tag avec la même clé K et le compare. S'ils diffèrent, le message a été altéré ou ne vient pas du bon émetteur.
Comme la clé est partagée, un MAC n'offre pas de non-répudiation : les deux parties peuvent produire le même tag, on ne peut donc pas prouver à un tiers qui des deux l'a émis. Pour cela, il faut une signature.
HMAC
HMAC construit un MAC à partir d'une fonction de hachage (HMAC-SHA-256…). Sa construction imbriquée :
HMAC(K, m) = H( (K ⊕ opad) || H( (K ⊕ ipad) || m ) )
évite les faiblesses du naïf H(K || m) (vulnérable aux attaques par extension de longueur sur les hachages de type Merkle-Damgård comme SHA-2). HMAC est robuste, simple, très répandu.
Autres MAC
- CMAC : MAC basé sur un chiffrement par bloc (ex. AES-CMAC).
- GMAC : composante d'authentification de GCM.
- KMAC : MAC basé sur SHA-3/Keccak.
- Poly1305 : MAC rapide, utilisé dans ChaCha20-Poly1305.
Combiner chiffrement et MAC
Quand on chiffre et authentifie séparément, l'ordre compte :
| Schéma | Évaluation |
|---|---|
| Encrypt-then-MAC (chiffrer puis MAC sur le chiffré) | Recommandé : on rejette un chiffré altéré sans le déchiffrer. |
| MAC-then-Encrypt | Fragile : déchiffre avant de vérifier → expose aux oracles de padding. |
| Encrypt-and-MAC | Déconseillé : le MAC peut fuiter de l'information sur le clair. |
Le plus simple et le plus sûr reste d'utiliser une primitive AEAD qui intègre correctement les deux.
Comparaison en temps constant
La comparaison du tag reçu et du tag recalculé doit se faire en temps constant : une comparaison qui s'arrête au premier octet différent fuit, par le timing, la position de l'écart et permet de forger un tag valide octet par octet. Utiliser les fonctions dédiées (ex. hmac.compare_digest, CRYPTO_memcmp).
Points clés à retenir
- Un MAC prouve intégrité + authenticité, mais pas la non-répudiation (clé partagée).
- HMAC évite les attaques par extension de longueur ; préférer HMAC à
H(K||m). - Encrypt-then-MAC si l'on combine soi-même ; mieux : utiliser de l'AEAD.
- Comparer les tags en temps constant.
Voir aussi
- Chiffrement authentifié (AEAD)
- Fonctions de hachage et primitives associées
- Cryptographie asymétrique
- Attaques sur le chiffrement symétrique
| Cryptographie symétrique — Portail | |
|---|---|
| Fondamentaux | Principe · Bloc et flot · Modes opératoires · Padding · IV et nonces |
| Intégrité / auth. | MAC et HMAC · AEAD |
| Gestion des clés | Aléa / CSPRNG · KDF · Échange de clés · Stockage / rotation |
| Algorithmes | AES · ChaCha20/Salsa20 · DES / 3DES · Blowfish et Twofish · RC4 · Camellia, ARIA et SM4 · AES-GCM · ChaCha20-Poly1305 · Hachage |
| Applications | Données au repos · En transit / hybride |
| Sécurité avancée | Attaques · Conformité · Post-quantique |