HMAC funktioniert mit jedem Hash (HMAC-SHA256 liefert ein 32-Byte-Tag) und bleibt sogar mit Hashes sicher, deren Kollisionsresistenz gebrochen ist; deshalb taucht HMAC-SHA1 noch in TOTP auf. Schlüssel, die länger als die Blockgröße des Hashes sind (64 Byte bei SHA-256), werden zuerst gehasht, kürzere mit Nullen aufgefüllt; ein Schlüssel sollte mindestens so viele Bit Entropie haben wie das angestrebte Sicherheitsniveau. RFC 7518 §3.2 verlangt für HS256 Schlüssel mit mindestens 256 Bit.
Einsatzgebiete: JWT mit HS256/HS384/HS512, Webhook-Signaturen (etwa X-Hub-Signature-256 bei GitHub und Stripe-Signature bei Stripe), das Signieren von Anfragen mit AWS Signature Version 4, das Innenleben von HKDF und PBKDF2, Record-MACs in TLS 1.2 sowie TOTP- und HOTP-Codes. Vergleiche Tags mit einer zeitkonstanten Funktion.
Ein HMAC ist keine Signatur: Jeder Verifizierer besitzt denselben Schlüssel und hätte das Tag selbst erzeugen können, deshalb bietet ein HMAC keine Nichtabstreitbarkeit und taugt nicht, wenn Verifizierer keine Tokens ausstellen können sollen. Der HMAC-Rechner berechnet und prüft Tags lokal.