HMAC fonctionne avec n’importe quelle fonction de hachage (HMAC-SHA256 donne un tag de 32 octets) et reste sûr même avec des fonctions dont la résistance aux collisions est cassée ; c’est pourquoi HMAC-SHA1 apparaît encore dans TOTP. Les clés plus longues que la taille de bloc de la fonction de hachage (64 octets pour SHA-256) sont d’abord hachées, les plus courtes complétées par des zéros ; une clé devrait avoir au moins autant de bits d’entropie que le niveau de sécurité visé. La RFC 7518 §3.2 exige des clés HS256 d’au moins 256 bits.
Usages : JWT HS256/HS384/HS512, signatures de webhooks (par exemple X-Hub-Signature-256 de GitHub et Stripe-Signature de Stripe), signature des requêtes AWS Signature Version 4, fonctionnement interne de HKDF et de PBKDF2, MAC des enregistrements TLS 1.2 et codes TOTP/HOTP. Comparez les tags avec une fonction en temps constant.
Un HMAC n’est pas une signature : chaque vérificateur détient la même clé et aurait pu produire le tag ; il n’offre donc aucune non-répudiation et ne convient pas lorsque les vérificateurs ne doivent pas pouvoir émettre de jetons. Le calculateur HMAC calcule et vérifie les tags localement.