HMAC Dijelaskan
HMAC (Hash-Based Message Authentication Code) adalah mekanisme untuk memverifikasi integritas dan keaslian pesan menggunakan fungsi hash kriptografi yang dikombinasikan dengan kunci rahasia. Tidak seperti hashing biasa yang dapat dihitung oleh siapa saja, HMAC memerlukan pengetahuan tentang kunci rahasia untuk menghasilkan atau memverifikasi kode otentikasi.
Hash biasa seperti SHA256 memberi tahu Anda bahwa pesan tidak berubah, tetapi tidak membuktikan siapa yang membuatnya. Penyerang yang memodifikasi pesan dapat dengan mudah menghitung ulang hash, dan penerima tidak memiliki cara untuk mendeteksi manipulasi tersebut. HMAC mengatasi ini dengan menggabungkan kunci rahasia ke dalam perhitungan hash. Hanya seseorang dengan kunci yang dapat menghasilkan HMAC yang valid, menjadikannya cocok untuk mengotentikasi pesan antara pihak yang berbagi rahasia.
Cara Kerja HMAC
HMAC menggunakan dua kali proses fungsi hash dengan kunci rahasia. Algoritma ini didefinisikan dalam RFC 2104 dan bekerja sebagai berikut:
- Kunci rahasia ditambahkan hingga ukuran blok fungsi hash
- Kunci yang ditambahkan di-XOR dengan konstanta padding dalam (ipad = 0x36 diulang)
- Pesan ditambahkan ke kunci padding dalam
- Hasilnya di-hash
- Kunci yang ditambahkan di-XOR dengan konstanta padding luar (opad = 0x5C diulang)
- Hash dari langkah 4 ditambahkan ke kunci padding luar
- Hasilnya di-hash lagi
HMAC(K, m) = H((K' ⊕ opad) || H((K' ⊕ ipad) || m))
Pendekatan hashing ganda ini mencegah serangan length extension dan memastikan bahwa meskipun fungsi hash yang mendasarinya memiliki kelemahan, konstruksi HMAC tetap aman.
HMAC vs Hashing Biasa
| Fitur | Hash Biasa (SHA256) | HMAC-SHA256 |
|---|---|---|
| Kunci diperlukan | Tidak | Ya |
| Pemeriksaan integritas | Ya | Ya |
| Otentikasi | Tidak | Ya |
| Deteksi manipulasi | Hitung ulang penuh | Deteksi tanpa kunci |
| Terbaik untuk | Checksum file | Otentikasi API |
| Length extension | Rentan | Tahan |
Kasus Penggunaan Umum
Otentikasi API — klien menandatangani setiap permintaan dengan HMAC menggunakan kunci bersama. Server menghitung ulang HMAC dan membandingkannya. Jika cocok, permintaan tersebut asli.
Penandatanganan token JWT — meskipun JWT biasanya menggunakan HMAC atau RSA signing yang lebih sederhana, HMAC adalah algoritma yang valid untuk JWT (HS256, HS384, HS512).
Verifikasi webhook — layanan seperti Stripe, GitHub, dan Slack menandatangani payload webhook dengan HMAC sehingga Anda dapat memverifikasi bahwa payload tersebut berasal dari layanan tersebut.
Token sesi — HMAC dapat menghasilkan token sesi yang tidak dapat dipalsukan tanpa menyimpannya di database.
Contoh Kode
PHP
$secret = 'my-secret-key';
$message = 'message-to-authenticate';
// Generate HMAC
$hmac = hash_hmac('sha256', $message, $secret);
echo $hmac;
// Verify HMAC
$expected = hash_hmac('sha256', $message, $secret);
if (hash_equals($expected, $providedHmac)) {
echo 'Authentic';
}
Python
import hmac
import hashlib
secret = b'my-secret-key'
message = b'message-to-authenticate'
# Generate HMAC
hmac_value = hmac.new(secret, message, hashlib.sha256).hexdigest()
print(hmac_value)
# Verify HMAC (constant-time comparison)
expected = hmac.new(secret, message, hashlib.sha256).digest()
received = bytes.fromhex(provided_hmac)
if hmac.compare_digest(expected, received):
print('Authentic')
JavaScript (Node.js)
const crypto = require('crypto');
const secret = 'my-secret-key';
const message = 'message-to-authenticate';
// Generate HMAC
const hmac = crypto.createHmac('sha256', secret)
.update(message)
.digest('hex');
console.log(hmac);
// Verify
const expected = crypto.createHmac('sha256', secret)
.update(message)
.digest();
Algoritma HMAC
HMAC dapat menggunakan fungsi hash kriptografi apa pun. Nama algoritma biasanya menggabungkan "HMAC" dengan nama hash.
| Algoritma | Fungsi Hash | Ukuran Output |
|---|---|---|
| HMAC-MD5 | MD5 | 128 bit |
| HMAC-SHA1 | SHA-1 | 160 bit |
| HMAC-SHA256 | SHA-256 | 256 bit |
| HMAC-SHA512 | SHA-512 | 512 bit |
| HMAC-SHA3-256 | SHA3-256 | 256 bit |
Gunakan HMAC-SHA256 sebagai default. HMAC-MD5 dan HMAC-SHA1 sudah tidak direkomendasikan untuk aplikasi yang sensitif terhadap keamanan.
Pertimbangan Keamanan
Ukuran kunci — kunci harus setidaknya sepanjang output hash. Untuk HMAC-SHA256, gunakan kunci minimal 32 byte (256 bit). Kunci yang lebih panjang akan di-hash hingga ukuran blok.
Kerahasiaan kunci — keamanan HMAC sepenuhnya bergantung pada kunci yang tetap rahasia. Gunakan sistem manajemen kunci atau variabel lingkungan. Jangan pernah menulis kunci secara hardcode dalam kode sumber.
Perbandingan waktu-konstan — selalu bandingkan nilai HMAC menggunakan fungsi perbandingan waktu-konstan seperti hash_equals() di PHP atau hmac.compare_digest() di Python. Serangan timing dapat mengungkapkan HMAC yang benar byte demi byte.
Serangan replay — HMAC saja tidak mencegah serangan replay. Sertakan timestamp atau nonce dalam pesan yang ditandatangani dan verifikasi di server.
Alat Online
Alat HMAC Generator di Help2Code menghitung nilai HMAC dengan pilihan algoritma dan kunci rahasia Anda. Gunakan untuk menguji implementasi HMAC atau menghasilkan vektor pengujian selama pengembangan.
Kesimpulan
HMAC menyediakan otentikasi pesan menggunakan kunci bersama dan fungsi hash kriptografi. Ini penting untuk keamanan API, verifikasi webhook, dan skenario apa pun di mana Anda perlu memverifikasi integritas dan keaslian pesan. Gunakan HMAC-SHA256 dengan kunci rahasia yang kuat dan selalu bandingkan nilai HMAC menggunakan fungsi waktu-konstan.