HMAC nécessite une clé en plus du message

SHA-256 simple calcule le hash des octets du message. HMAC-SHA-256 calcule une valeur d’authentification avec une clé et un message. La construction de RFC 2104 ne consiste pas simplement à préfixer le message par la clé puis à calculer un hash. Un hash sans clé concordant n’authentifie pas à lui seul l’expéditeur.

SHA-256 reçoit un message ; HMAC-SHA-256 reçoit une clé et un message. Les deux sorties font 256 bits
M est le message ; K est la clé. Schéma conceptuel original des entrées. Une longueur égale ne signifie pas des valeurs ou fonctions identiques.

RFC 2104 §2: HMAC

Reproduire les octets de la clé de test RFC

Le cas 1 de RFC 4231 utilise vingt octets 0x0b et le message Hi There. Le code ci-dessous importe une clé HMAC Web Crypto et affiche le résultat hexadécimal. Répéter le texte 0b vingt fois produit 40 octets, donc une autre entrée. Cette clé de test est publique, ce n’est pas un secret de production.

L’outil Moyoutil calcule des hashes SHA simples et ne propose pas d’entrée HMAC. Ce code JavaScript distinct n’est pas un système complet de connexion ou de vérification de webhooks. Une véritable authentification exige de protéger la clé secrète et de vérifier correctement.

const hex = bytes => Array.from(new Uint8Array(bytes),
  n => n.toString(16).padStart(2, '0')).join('');
const keyBytes = new Uint8Array(20).fill(0x0b);
const message = new TextEncoder().encode('Hi There');
const key = await crypto.subtle.importKey(
  'raw', keyBytes, {name:'HMAC', hash:'SHA-256'},
  false, ['sign']);
const mac = await crypto.subtle.sign('HMAC', key, message);
console.log(hex(mac));
// b0344c61d8db38535ca8afceaf0bf12b
// 881dc200c9833da726e9376c2e32cff7

RFC 4231 §4.2: Test Case 1

W3C Web Cryptography: HMAC

Questions fréquemment posées

Puis-je comparer les résultats parce que les noms contiennent SHA-256 ?

Ne confondez pas SHA-256 simple et HMAC-SHA-256. Comparer HMAC exige les mêmes octets de clé et de message et le même algorithme. Distinguez aussi les formats de sortie, comme l’hexadécimal et Base64.