Generator HMAC & Verifikator Tanda Tangan
Generator dan verifikator HMAC online gratis. Hitung HMAC-SHA256/SHA1/SHA384/SHA512 dengan kunci Teks, Hex, atau Base64 dan output Hex/Base64/Base64URL. 100% di browser Anda — kunci tidak pernah meninggalkan halaman.
Apa Itu HMAC?
HMAC (Hash-based Message Authentication Code) adalah tag pendek berpanjang-tetap yang membuktikan sebuah pesan tidak dimodifikasi sekaligus autentik — bahwa pesan itu dibuat oleh seseorang yang memegang kunci rahasia bersama. Didefinisikan di RFC 2104 dan FIPS 198-1, HMAC menggabungkan fungsi hash kriptografis apa pun dengan kunci rahasia dalam konstruksi bersarang spesifik, ditulis sebagai HMAC(K, m) = H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)). Hash dalam mengikat kunci ke pesan; hash luar membungkus hasilnya, dan itulah yang membuat HMAC tahan terhadap serangan length-extension yang memengaruhi fungsi SHA-1 dan SHA-256 mentah.
HMAC ada di mana-mana dalam infrastruktur web modern. Ia menandatangani webhook agar Anda dapat memastikan permintaan masuk benar-benar berasal dari GitHub, Stripe, Slack, atau Twilio dan bukan palsu. Ia menandatangani permintaan API (AWS Signature Version 4 dibangun di atas HMAC-SHA256) agar server dapat mengautentikasi pemanggil tanpa mengirim kata sandi lewat jaringan. Ia adalah S dalam HS256: sebuah JWT yang ditandatangani dengan HS256 membawa HMAC-SHA256 atas header dan payload-nya, yang dapat Anda periksa dengan encoder JWT. Ia juga menopang derivasi kunci TLS (HKDF), algoritma kata-sandi-sekali-pakai (HOTP/TOTP), dan integritas pesan di banyak sekali layanan internal.
Alat ini menghitung HMAC sepenuhnya di browser Anda memakai crypto.subtle.sign('HMAC', ...) dari Web Crypto API — primitif yang sama yang dipakai browser selama jabat tangan TLS. Kunci rahasia dan pesan Anda tidak pernah diunggah, jadi aman untuk rahasia penandatanganan produksi. Karena rahasia yang sama dapat dinyatakan sebagai teks mentah, hex, atau base64, alat ini membiarkan Anda memilih Pengodean kunci secara eksplisit, dan karena penyedia berbeda mengharapkan tag dalam bentuk berbeda, Anda dapat menghasilkan Hex, Base64, atau Base64URL. Tab Verifikasi memungkinkan Anda memeriksa tanda tangan yang Anda terima, memakai perbandingan waktu-konstan sehingga pemeriksaannya sendiri tidak membocorkan informasi waktu.
const crypto = require('crypto');
// HMAC-SHA256 with a UTF-8 text key, hex output
const hmac = crypto
.createHmac('sha256', 'my-secret-key')
.update('Hello, World!')
.digest('hex');
console.log(hmac);
// → 'cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699'
// Verify a signature in constant time
function verify(message, key, expectedHex) {
const actual = crypto.createHmac('sha256', key).update(message).digest();
const expected = Buffer.from(expectedHex, 'hex');
return actual.length === expected.length &&
crypto.timingSafeEqual(actual, expected);
} Fitur Utama
Menghasilkan dan memverifikasi dalam satu alat
Hasilkan tanda tangan di tab Hasilkan, atau tempelkan HMAC yang Diharapkan di tab Verifikasi untuk mengautentikasi webhook atau token yang masuk. Verifikasi memakai perbandingan waktu-konstan sehingga hasilnya tidak pernah membocorkan informasi waktu.
Pilih pengodean kunci
Tafsirkan rahasia Anda sebagai Teks (UTF-8), Heksadesimal, atau Base64. Inilah pengaturan yang dihilangkan kebanyakan alat lain — dan alasan paling umum dua sistem menghitung HMAC berbeda untuk kunci yang sama.
Tiga pengodean output
Keluarkan tag sebagai Hex (webhook GitHub, AWS), Base64 (Stripe, Twilio, banyak API), atau Base64URL (JWT dan token aman-URL) agar cocok dengan integrasi Anda tanpa konversi manual.
Empat algoritma native
HMAC-SHA256 secara default, ditambah SHA-1, SHA-384, dan SHA-512. Semua berjalan di Web Crypto API browser, jadi tidak ada pustaka kripto JavaScript yang perlu dipercaya dan tidak ada penalti performa.
100% sisi-klien dan privat
Kunci rahasia dan pesan Anda diproses sepenuhnya di browser dan tidak pernah dikirim ke server mana pun. Buka tab Network dan Anda akan melihat nol permintaan keluar — aman untuk rahasia penandatanganan produksi.
Komputasi langsung
HMAC dihitung ulang seketika saat Anda menyunting pesan, kunci, pengodean, atau algoritma — tanpa perjalanan tombol Hasilkan, sehingga Anda bisa bereksperimen dengan pengodean sampai nilai Anda cocok dengan milik server.
Dibangun di atas vektor teruji
Output divalidasi terhadap vektor uji HMAC RFC 4231 resmi, jadi Anda bisa percaya digest cocok dengan yang dihasilkan OpenSSL, modul crypto Node, dan pustaka hmac Python.
Contoh HMAC
Mulai cepat — HMAC-SHA256, output hex
Hello, World!
cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699
Dengan kunci "my-secret-key" (Pengodean kunci = Teks), algoritma HMAC-SHA256, dan Format output = Hex, pesan "Hello, World!" menghasilkan cf3141611e22ea26a9cac6fe41d941274dd6653622c83cba13972d177bd69699. Ini adalah digest hex 64-karakter kanonik yang Anda peroleh dari crypto.createHmac('sha256', key).update(msg).digest('hex') milik Node.
Verifikasi webhook gaya Stripe (output Base64)
{"id":42,"event":"user.created"} Cd2f7zTKaJFeG6k+t1FcvDPn51OAZ2f4GrxkCUgMhGs=
Banyak penyedia webhook mengirim tanda tangan sebagai Base64. Dengan kunci "whsec_test_secret" (Teks), HMAC-SHA256, dan Format output = Base64, body JSON tersebut ditandatangani menjadi Cd2f7zTKaJFeG6k+t1FcvDPn51OAZ2f4GrxkCUgMhGs=. Tempelkan nilai itu ke tab Verifikasi untuk memastikan permintaan benar-benar berasal dari penyedia Anda sebelum memprosesnya. Secara internal HMAC berjalan di atas primitif yang sama dengan generator hash SHA-256 kami, tetapi dengan kunci rahasia Anda.
Vektor referensi RFC 4231
what do ya want for nothing?
5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843
Ini adalah kasus uji 2 dari RFC 4231, dokumen vektor-uji HMAC resmi. Dengan kunci "Jefe" (Teks), HMAC-SHA256, output Hex, pesan "what do ya want for nothing?" menghasilkan 5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843. Mencocokkan nilai persis ini adalah cara Anda membuktikan implementasi HMAC sudah benar.
HMAC-SHA512 untuk digest yang lebih panjang
The quick brown fox
36f44b125a8a90639dc46733039571792e081e0fd8685ff746784b02ed14aa35629d562c7117cde4a701570551faa5a5e1b7ef1eb5c3bcd4cc1fdb8923fcf14e
Ganti algoritma ke HMAC-SHA512 untuk digest 128-karakter (512-bit). Dengan kunci "key" (Teks) dan output Hex, "The quick brown fox" menghasilkan nilai di atas. SHA-512 lebih cepat daripada SHA-256 di sebagian besar perangkat keras 64-bit dan memberi output lebih besar, meski SHA-256 tetap menjadi default interoperabilitas.
Cara Menghasilkan & Memverifikasi HMAC
- 1
Pilih algoritma
Pilih HMAC-SHA256 (default dan pilihan tepat untuk hampir semua webhook, API, dan JWT), atau beralih ke SHA-1, SHA-384, atau SHA-512 agar cocok dengan sistem yang membutuhkannya. Keempatnya berjalan native di browser Anda lewat Web Crypto API.
- 2
Masukkan kunci rahasia dan atur pengodeannya
Ketik atau tempelkan kunci rahasia Anda, lalu atur Pengodean kunci agar cocok dengan cara server menafsirkannya: Teks (UTF-8) untuk string biasa, Hex untuk blob heksadesimal, atau Base64 untuk rahasia base64. Salah di sini adalah penyebab utama HMAC tidak cocok, jadi saat ragu cobalah ketiganya.
- 3
Masukkan pesan
Tempelkan byte persis yang ingin Anda tandatangani — untuk webhook ini adalah body permintaan mentah, byte-per-byte, tanpa serialisasi ulang atau perubahan spasi. HMAC dihitung ulang langsung saat Anda menyunting, tanpa apa pun yang dikirim ke server.
- 4
Pilih format output dan salin
Pilih Hex (gaya GitHub), Base64 (gaya Stripe/AWS), atau Base64URL (gaya JWT) agar cocok dengan yang diharapkan integrasi Anda, lalu klik Salin untuk mengambil tanda tangannya.
- 5
Verifikasi tanda tangan yang ada
Beralih ke tab Verifikasi, tempelkan HMAC yang Diharapkan dari sebuah header atau token, dan alat memastikan dalam waktu konstan apakah tanda tangan yang Anda hitung cocok — sehingga Anda dapat mengautentikasi payload sebelum bertindak atasnya.
Kesalahan HMAC yang Umum
Pengodean kunci tidak cocok (penyebab #1 ketidakcocokan)
Rahasia yang sama dapat dibaca sebagai teks UTF-8 mentah, sebagai hex, atau sebagai base64 — dan setiap tafsiran menghasilkan byte kunci yang sepenuhnya berbeda, sehingga HMAC tidak akan cocok jika alat Anda dan server tidak sepakat. Jika penyedia memberi Anda rahasia hex atau base64, Anda harus mendekodenya ke byte sebelum penandatanganan, bukan menandatangani string apa adanya. Saat tanda tangan gagal diverifikasi, coba kunci di bawah ketiga opsi Pengodean kunci terlebih dahulu.
// Server stored a base64 secret but you sign the literal string
createHmac('sha256', 'c2VjcmV0LWtleQ==').update(msg) // Decode the base64 secret to raw bytes first
createHmac('sha256', Buffer.from('c2VjcmV0LWtleQ==', 'base64')).update(msg) Pengodean output tidak cocok
HMAC adalah byte mentah; hex, base64, dan base64url hanyalah pengodean teks berbeda dari nilai yang sama. Jika server mengirim tanda tangan base64 dan Anda membandingkannya dengan digest hex Anda, keduanya tidak akan pernah cocok meski byte dasarnya identik. Cocokkan Format output dengan yang dipakai header atau token.
// Provider sends base64, you compare hex
expected = 'Cd2f7z...=' // base64
actual = digest('hex') // hex — never matches // Produce the same encoding the provider uses
actual = digest('base64') Menandatangani JSON yang diserialisasi ulang alih-alih body mentah
Tanda tangan webhook mencakup byte persis yang dikirim penyedia. Jika Anda mem-parse JSON dan men-stringify ulang, urutan kunci, spasi, dan format angka bisa berubah, mengubah byte dan merusak tanda tangan. Selalu HMAC-kan body permintaan mentah yang ditangkap sebelum parsing apa pun.
// Re-serialization changes the bytes body = JSON.stringify(JSON.parse(rawBody)) verify(hmac(body))
// Sign the raw bytes exactly as received verify(hmac(rawBody))
Memakai == alih-alih perbandingan waktu-konstan
Membandingkan tanda tangan yang diterima dengan == atau kesetaraan string sederhana membocorkan informasi waktu, karena perbandingan berhenti pada byte pertama yang berbeda. Melalui banyak percobaan penyerang dapat memulihkan tag yang valid. Selalu gunakan pemeriksaan kesetaraan waktu-konstan saat memverifikasi.
if (received === computed) { /* trust */ } if (crypto.timingSafeEqual(receivedBuf, computedBuf)) { /* trust */ } Untuk Apa HMAC Digunakan
- Verifikasi tanda tangan webhook
- Penyedia seperti GitHub, Stripe, Slack, dan Twilio menandatangani setiap webhook dengan HMAC atas body permintaan dan rahasia yang hanya Anda bagikan. Hitung ulang tag dan bandingkan dengan header (misalnya X-Hub-Signature-256) untuk memastikan event itu asli sebelum Anda bertindak atasnya. Gunakan tab Verifikasi untuk melakukan ini tanpa menulis kode sekali-pakai.
- Tandatangani permintaan API
- API terautentikasi sering mewajibkan klien untuk menandatangani permintaan dengan HMAC (metode, path, timestamp, body) memakai rahasia bersama alih-alih mengirim rahasia itu sendiri. AWS Signature Version 4 adalah contoh kanoniknya. Alat ini membiarkan Anda mereproduksi dan men-debug tanda tangan itu langkah demi langkah.
- Jamin integritas pesan
- Saat Anda melewatkan token, cookie, atau pesan antar layanan, melampirkan HMAC membuat penerima dapat mendeteksi perusakan apa pun. Karena tag bergantung pada rahasia, penyerang tidak dapat menghitung ulangnya setelah memodifikasi data — berbeda dari checksum biasa.
- Pahami penandatanganan JWT HS256
- JWT yang ditandatangani dengan HS256 hanyalah base64url(header) + '.' + base64url(payload), ditandatangani dengan HMAC-SHA256 dan hasilnya dikeluarkan sebagai Base64URL. Atur algoritma ke SHA-256 dan output ke Base64URL di sini untuk melihat persis bagaimana tanda tangan itu dihasilkan, lalu periksa silang di encoder JWT.
- Debug tanda tangan yang tidak cocok
- Saat HMAC Anda tidak mau cocok dengan milik server, alat ini adalah cara tercepat untuk mengisolasi penyebabnya: coba kunci sebagai Teks, Hex, dan Base64, ganti output antara Hex dan Base64, dan pastikan Anda menandatangani byte mentah yang persis — semua tanpa men-deploy ulang kode apa pun.
Cara Kerja HMAC
- Konstruksi RFC 2104
- HMAC didefinisikan sebagai H((K ⊕ opad) ‖ H((K ⊕ ipad) ‖ m)), di mana ipad adalah byte 0x36 yang diulang dan opad adalah 0x5c yang diulang, keduanya sampai ukuran blok hash. Kunci lebih panjang dari ukuran blok di-hash dulu; kunci lebih pendek diisi-nol. Penyaringan dua-tahap ini yang memberi HMAC bukti keamanannya, yang berlaku bahkan jika hash dasar tidak tahan-tabrakan.
- Mengapa hash berkunci mengalahkan hash biasa
- Hash biasa hanya membuktikan bahwa data tidak rusak secara tak sengaja, karena siapa pun dapat menghitung ulangnya untuk pesan apa pun — termasuk yang sudah dirusak. HMAC menyertakan rahasia, sehingga hanya pemegang kunci yang dapat menghasilkan tag valid. Itu mengubah integritas-saja menjadi integritas plus keaslian, yang merupakan properti yang sebenarnya dibutuhkan webhook dan permintaan bertanda tangan.
- Ketahanan length-extension
- SHA-1, SHA-256, dan SHA-512 telanjang adalah hash Merkle–Damgård yang rentan terhadap length-extension: diberi H(secret ‖ msg), penyerang dapat menghitung H(secret ‖ msg ‖ extra) tanpa mengetahui rahasianya. Skema 'MAC prefiks-rahasia' yang naif dipatahkan oleh ini. Hash luar HMAC menetralkan serangan tersebut, yang merupakan alasan utama memakai HMAC alih-alih menghash rahasia dan pesan bersama.
- Memilih SHA-256 vs SHA-512
- HMAC-SHA256 menghasilkan tag 256-bit (64 karakter hex) dan merupakan default interoperabilitas — cepat, ada di mana-mana, dan didukung di semua tempat. HMAC-SHA512 menghasilkan tag 512-bit (128 karakter hex) dan sering lebih cepat di CPU 64-bit karena SHA-512 memakai kata 64-bit. Pilih SHA-256 kecuali sebuah spesifikasi atau sistem rekan membutuhkan SHA-512; keduanya aman untuk autentikasi.
- Implementasi Web Crypto
- Alat ini memanggil crypto.subtle.importKey untuk memuat kunci Anda (didekode dari Teks, Hex, atau Base64) dan crypto.subtle.sign('HMAC', ...) untuk menghitung tag, lalu mengodekan byte mentah sebagai Hex, Base64, atau Base64URL. Ini adalah implementasi native dan teraudit yang sama yang dipakai browser untuk TLS, berjalan di luar mesin JavaScript demi kecepatan.
Praktik Terbaik HMAC
- Gunakan kunci setidaknya sepanjang output hash
- Untuk HMAC-SHA256 gunakan rahasia minimal 32 byte acak (256 bit); untuk SHA-512 gunakan 64. Kunci yang pendek atau ber-entropi rendah adalah mata rantai terlemah. Hasilkan kunci dari sumber acak yang aman secara kriptografis — jangan pernah dari kata sandi atau string yang dapat ditebak.
- Selalu bandingkan tag dalam waktu konstan
- Verifikasi tanda tangan dengan perbandingan waktu-konstan (crypto.timingSafeEqual di Node, hmac.compare_digest di Python) alih-alih == atau kesetaraan string. Perbandingan naif kembali lebih awal pada byte pertama yang berbeda, membocorkan waktu yang dapat membuat penyerang memulihkan tag valid byte demi byte. Tab Verifikasi alat ini sudah membandingkan dalam waktu konstan.
- Jangan pernah mencatat atau membocorkan kunci rahasia
- Jauhkan rahasia penandatanganan dari log, pesan kesalahan, URL, dan kode sisi-klien. Simpan di pengelola rahasia atau variabel lingkungan, putar secara berkala, dan batasi setiap integrasi ke kuncinya sendiri agar satu kebocoran tidak mengompromikan segalanya.
- Utamakan HMAC-SHA256 atau yang lebih kuat
- Default ke HMAC-SHA256; naik ke SHA-384 atau SHA-512 saat rekan membutuhkannya. Hindari HMAC-SHA1 untuk sistem baru dan jangan pernah memakai HMAC-MD5. Meski HMAC mentolerir hash yang lebih lemah lebih baik daripada tanda tangan mentah, memulai dari hash modern memberi Anda margin terbanyak.
- Tandatangani byte yang persis, termasuk timestamp
- Tandatangani payload mentah yang tidak dimodifikasi — serialisasi ulang JSON atau memangkas spasi mengubah byte dan merusak verifikasi. Untuk penandatanganan permintaan, sertakan timestamp atau nonce dalam data yang ditandatangani dan tolak tanda tangan basi untuk mencegah serangan ulang (replay).
FAQ HMAC
Apa itu HMAC?
Apa beda HMAC dengan hash biasa seperti SHA-256?
Bagaimana cara memverifikasi tanda tangan webhook yang masuk?
Pengodean kunci dan output mana yang dipakai server saya?
Apakah HMAC-SHA256 aman?
Mengapa tidak ada HMAC-MD5 atau HMAC-SHA-3 di sini?
HS256 (HMAC) vs RS256 (RSA) — mana yang harus saya pakai untuk JWT?
Alat Terkait
Lihat semua alat →Generator & Verifier Hash Bcrypt
Alat Keamanan
Buat dan verifikasi hash kata sandi bcrypt online — biaya yang dapat diatur, prefiks $2b$/$2a$/$2y$. 100% di browser Anda; kata sandi tidak pernah diunggah.
JWT Decoder
Alat Keamanan
Dekode token JWT online dengan dekoder JWT gratis kami. Periksa header, payload, tanda tangan, kedaluwarsa, dan klaim secara instan. 100% browser — token Anda tidak meninggalkan perangkat. Tanpa pendaftaran, tanpa pelacakan.
JWT Encoder & Generator
Alat Keamanan
Generator & encoder JWT online gratis. Susun header dan payload, tandatangani dengan HS256, RS256, atau ES256 secara instan. 100% di browser — secret dan key Anda tidak pernah meninggalkan perangkat.
Generator JWT Secret Gratis — HS256/384/512
Alat Keamanan
Buat JWT secret kuat sesuai RFC untuk HS256/384/512 — 100% di browser, tak pernah dikirim ke server. base64url, base64, atau hex; salin untuk .env.
MD5 Hash Generator & Alat Checksum File
Alat Keamanan
Hasilkan hash MD5, SHA-256, SHA-1 & SHA-512 secara online gratis. Hash teks atau file di browser Anda, verifikasi checksum dan salin hasil. Tanpa pendaftaran.
Generator Kata Sandi Acak Online — Kuat, Aman & Gratis
Alat Keamanan
Buat kata sandi acak yang kuat secara instan — gratis, tanpa pendaftaran, 100% di browser. Sesuaikan panjang & karakter, batch hingga 50 dengan analisis entropi.