HMAC membutuhkan kunci selain pesan

SHA-256 biasa menghitung hash byte pesan. HMAC-SHA-256 menghitung nilai autentikasi dari kunci dan pesan. Konstruksi RFC 2104 bukan sekadar menambahkan kunci di depan pesan lalu menghitung hash. Hash tanpa kunci yang cocok saja tidak mengautentikasi pengirim.

SHA-256 menerima pesan; HMAC-SHA-256 menerima kunci dan pesan. Kedua output berukuran 256 bit
M adalah pesan; K adalah kunci. Diagram konsep input buatan sendiri. Panjang yang sama tidak berarti nilai atau fungsi yang sama.

RFC 2104 §2: HMAC

Reproduksi kunci uji RFC sebagai byte

Kasus uji 1 RFC 4231 memakai dua puluh byte 0x0b dan pesan Hi There. Kode berikut mengimpor kunci HMAC Web Crypto dan menampilkan hasil heksadesimal. Mengulang teks 0b dua puluh kali menghasilkan 40 byte, input berbeda. Ini kunci uji publik, bukan rahasia produksi.

Alat Moyoutil menghitung hash SHA biasa dan tidak menyediakan input HMAC. Kode berikut adalah contoh JavaScript terpisah, bukan sistem lengkap login atau verifikasi webhook. Autentikasi nyata membutuhkan perlindungan kunci rahasia dan proses verifikasi yang benar.

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

Pertanyaan yang Sering Diajukan

Bolehkah membandingkan hasil karena kedua nama mengandung SHA-256?

Jangan samakan SHA-256 biasa dengan HMAC-SHA-256. Perbandingan HMAC memerlukan byte kunci, byte pesan, dan algoritma yang sama. Bedakan pula format output seperti heksadesimal dan Base64.