HMAC Generator
Hasilkan tanda tangan HMAC dengan SHA-256, SHA-384, atau SHA-512
Pesan
Kunci Rahasia
Tanda Tangan HMAC
Tanda tangan HMAC akan ditampilkan di sini…
Apa Itu HMAC?
HMAC (Hash-based Message Authentication Code) adalah konstruksi kriptografis yang didefinisikan dalam RFC 2104 yang menggabungkan fungsi hash dengan kunci rahasia untuk menghasilkan tag autentikasi berukuran tetap. Berbeda dengan hash biasa yang dapat dihitung oleh siapa saja, HMAC hanya dapat dibuat dan diverifikasi oleh pihak yang berbagi kunci rahasia. HMAC adalah mekanisme standar untuk memverifikasi integritas dan autentisitas pesan — memastikan bahwa data tidak diubah dan berasal dari pengirim yang tepercaya.
Algoritma HMAC bekerja dengan fungsi hash iteratif apa pun: SHA-256, SHA-384, SHA-512, bahkan fungsi lama seperti SHA-1 atau MD5. Konstruksi yang dihasilkan disebut berdasarkan hash yang mendasarinya — HMAC-SHA256, HMAC-SHA384, atau HMAC-SHA512. Karena keamanan HMAC bergantung pada fungsi hash yang tahan tabrakan dan memiliki sifat pseudorandom tertentu, algoritma keluarga SHA-2 adalah pilihan yang direkomendasikan untuk sistem baru. HMAC-SHA256 adalah varian yang paling banyak digunakan, dipakai dalam AWS Signature V4, webhook Stripe, webhook secrets GitHub, request signing Slack, dan JSON Web Tokens (HS256).
Desain HMAC menyediakan properti kritis yang tidak dimiliki hashing biasa: ketahanan terhadap length-extension attacks. Dengan SHA-256 saja, penyerang yang mengetahui H(message) dapat menghitung H(message || attacker_data) tanpa mengetahui pesan asli. Struktur double-hashing HMAC (hash dalam dan hash luar dengan kunci berpadding berbeda) mencegah serangan ini sepenuhnya. Inilah mengapa skema tanda tangan API menggunakan HMAC, bukan menambahkan kunci rahasia ke pesan lalu meng-hash hasilnya.
Mengapa Menggunakan Generator HMAC Online?
Menghitung tanda tangan HMAC biasanya memerlukan penulisan kode atau penggunaan alat CLI. Generator HMAC berbasis browser ini memungkinkan Anda membuat tanda tangan HMAC-SHA256, HMAC-SHA384, dan HMAC-SHA512 secara instan tanpa menginstal perangkat lunak atau beralih ke terminal.
Kasus Penggunaan HMAC Generator
HMAC vs Hash Biasa vs Enkripsi
HMAC, hashing biasa, dan enkripsi melayani tujuan yang berbeda. HMAC menyediakan autentikasi pesan — bukti bahwa pesan dibuat oleh seseorang dengan kunci rahasia dan tidak dimodifikasi. Hash biasa menyediakan integritas tetapi bukan autentikasi. Enkripsi menyediakan kerahasiaan. Tabel di bawah menjelaskan perbedaannya.
| Properti | HMAC | Plain Hash | Encryption |
|---|---|---|---|
| Purpose | Message authentication + integrity | Data integrity only (no key) | Confidentiality + integrity |
| Requires secret key | Yes | No | Yes |
| Verifiable by | Parties who share the secret | Anyone | Recipient with key |
| Reversible | No — digest only | No — digest only | Yes — decryption recovers data |
| Output size | Depends on hash (e.g. 256 bits) | Depends on hash | Variable (ciphertext) |
| Standard | RFC 2104 | FIPS 180-4 | NIST SP 800-38A (AES) |
| Use case example | Webhook signature verification | File checksum verification | Encrypting data at rest |
Perbandingan Algoritma HMAC
HMAC dapat menggunakan fungsi hash apa pun, tetapi pilihan algoritma yang mendasarinya menentukan ukuran output, tingkat keamanan, dan kompatibilitas browser. HMAC-SHA256 adalah pilihan paling umum untuk sistem baru. Tabel di bawah membandingkan varian yang kemungkinan akan Anda temui.
| Algoritma | Ukuran Digest | Panjang Hex | Web Crypto API | Terbaik untuk |
|---|---|---|---|---|
| HMAC-SHA256 | 256 bits | 64 hex chars | Yes | API signing, webhooks, JWT (HS256) |
| HMAC-SHA384 | 384 bits | 96 hex chars | Yes | TLS 1.3 PRF, CNSA compliance |
| HMAC-SHA512 | 512 bits | 128 hex chars | Yes | High-security signatures, HKDF |
| HMAC-SHA1 | 160 bits | 40 hex chars | Yes | Legacy OAuth 1.0, TOTP (RFC 6238) |
| HMAC-MD5 | 128 bits | 32 hex chars | No | Legacy only — not recommended |
Cara Kerja HMAC Secara Internal
HMAC menerapkan fungsi hash yang mendasarinya dua kali dengan dua pad turunan kunci yang berbeda. Konstruksi ini didefinisikan dalam RFC 2104 dan terbukti sebagai PRF (fungsi pseudorandom) di bawah asumsi kriptografis standar. Kunci terlebih dahulu dipadding atau di-hash agar sesuai dengan ukuran blok fungsi hash (64 byte untuk SHA-256, 128 byte untuk SHA-512).
where K' = key padded to block size, ipad = 0x36, opad = 0x5C
Algoritma melakukan XOR pada kunci berpadding dengan konstanta inner pad (ipad, 0x36 berulang), menggabungkannya dengan pesan, dan meng-hash hasilnya. Kemudian melakukan XOR pada kunci berpadding dengan konstanta outer pad (opad, 0x5C berulang), menggabungkannya dengan output hash dalam, dan meng-hash lagi. Struktur double-hashing inilah yang mencegah length-extension attacks dan memastikan output HMAC tidak dapat dihitung tanpa mengetahui kunci rahasia.
Contoh Kode HMAC
HMAC didukung secara native di setiap bahasa dan runtime utama. Web Crypto API menyediakan HMAC-SHA256, HMAC-SHA384, dan HMAC-SHA512 di browser tanpa library apa pun. Contoh di bawah menunjukkan pola penggunaan dunia nyata termasuk verifikasi webhook dan perbandingan constant-time.
async function hmacSHA256(message, secret) {
const enc = new TextEncoder()
const key = await crypto.subtle.importKey(
'raw', enc.encode(secret),
{ name: 'HMAC', hash: 'SHA-256' },
false, ['sign']
)
const sig = await crypto.subtle.sign('HMAC', key, enc.encode(message))
return Array.from(new Uint8Array(sig))
.map(b => b.toString(16).padStart(2, '0')).join('')
}
await hmacSHA256('hello world', 'my-secret-key')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
// Node.js (built-in crypto module)
const crypto = require('crypto')
crypto.createHmac('sha256', 'my-secret-key')
.update('hello world').digest('hex')
// → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"import hmac
import hashlib
# HMAC-SHA256
sig = hmac.new(
b'my-secret-key',
b'hello world',
hashlib.sha256
).hexdigest()
print(sig)
# → "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
# Verify a webhook signature (constant-time comparison)
expected = "90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad"
received = hmac.new(b'my-secret-key', b'hello world', hashlib.sha256).hexdigest()
if hmac.compare_digest(expected, received):
print("Signature valid")
# HMAC-SHA512
hmac.new(b'key', b'data', hashlib.sha512).hexdigest()package main
import (
"crypto/hmac"
"crypto/sha256"
"fmt"
)
func main() {
mac := hmac.New(sha256.New, []byte("my-secret-key"))
mac.Write([]byte("hello world"))
sig := mac.Sum(nil)
fmt.Printf("%x\n", sig)
// → 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad
// Verify: use hmac.Equal for constant-time comparison
expected := mac.Sum(nil)
fmt.Println(hmac.Equal(sig, expected)) // true
}# HMAC-SHA256 echo -n "hello world" | openssl dgst -sha256 -hmac "my-secret-key" # → SHA2-256(stdin)= 90eb182d8396f16d4341d582047f45c0a97d73388c5377d9ced478a2212295ad # HMAC-SHA512 echo -n "hello world" | openssl dgst -sha512 -hmac "my-secret-key" # Verify a file signature openssl dgst -sha256 -hmac "my-secret-key" release.tar.gz # HMAC with hex key (e.g. from a webhook secret) echo -n "payload" | openssl dgst -sha256 -hmac "$(echo -n '736563726574' | xxd -r -p)"