Codes d'authentification de message (MAC et HMAC)

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche

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

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

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