HMAC benötigt neben der Nachricht einen Schlüssel

Einfaches SHA-256 hasht die Nachrichtenbytes. HMAC-SHA-256 berechnet aus Schlüssel und Nachricht einen Authentifizierungswert. Die Konstruktion in RFC 2104 ist nicht einfach ein Hash aus vorangestelltem Schlüssel und Nachricht. Ein passender Hash ohne Schlüssel authentifiziert den Absender allein nicht.

SHA-256 erhält eine Nachricht; HMAC-SHA-256 einen Schlüssel und eine Nachricht. Beide Ausgaben haben 256 Bit
M ist die Nachricht, K der Schlüssel. Eigenes Konzeptdiagramm der Eingaben. Gleiche Ausgabelänge bedeutet nicht gleiche Werte oder Funktionen.

RFC 2104 §2: HMAC

Den RFC-Testschlüssel als Bytes nachvollziehen

Testfall 1 aus RFC 4231 verwendet zwanzig Bytes 0x0b und die Nachricht Hi There. Der folgende Code importiert einen Web-Crypto-HMAC-Schlüssel und gibt das Ergebnis hexadezimal aus. Der Text 0b zwanzigmal wiederholt ergibt 40 Bytes und eine andere Eingabe. Dies ist ein öffentlicher Testschlüssel, kein produktives Geheimnis.

Moyoutils Werkzeug berechnet einfache SHA-Hashes und hat keine HMAC-Eingabe. Der folgende Code ist ein separates JavaScript-Beispiel, kein vollständiges Login- oder Webhook-Prüfsystem. Echte Authentifizierung benötigt Schutz des geheimen Schlüssels und korrekte Prüfung.

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

Häufig gestellte Fragen

Kann ich Ergebnisse vergleichen, weil beide Namen SHA-256 enthalten?

Verwechseln Sie einfaches SHA-256 nicht mit HMAC-SHA-256. Ein HMAC-Vergleich benötigt dieselben Schlüsselbytes, Nachrichtenbytes und denselben Algorithmus. Unterscheiden Sie auch Ausgabeformate wie Hexadezimal und Base64.