Generator HMAC
Hitung HMAC-SHA1, SHA-256, SHA-384, atau SHA-512 dengan kunci teks, hex, atau Base64, dapatkan hasil hex dan Base64, dan cek signature webhook di browser Anda.
Pesan ditandatangani persis seperti yang diketik, di-encode sebagai UTF-8, termasuk spasi dan baris baru.
- HMAC (hex)
- HMAC (Base64)
- Header signature webhook (gaya GitHub)
Perbandingan berjalan dalam waktu konstan, seperti seharusnya dilakukan server, sehingga lamanya waktu tidak mengungkap berapa banyak karakter yang cocok.
Cara menghitung HMAC
- Tempel Pesan. Untuk webhook, pesan ini harus berupa body permintaan mentah, byte demi byte.
- Masukkan Kunci rahasia dan pilih Format kunci: Teks (UTF-8), Heksadesimal, atau Base64.
- Pilih Algoritme: HMAC-SHA1, HMAC-SHA256, HMAC-SHA384, atau HMAC-SHA512.
- Hasilnya diperbarui saat Anda mengetik; Anda juga bisa mengklik Buat HMAC. Anda mendapatkan HMAC (hex), HMAC (Base64), dan Header signature webhook (gaya GitHub), masing-masing dengan tombol Salin.
- Untuk memeriksa signature yang Anda terima, tempel di Bandingkan dengan signature yang diharapkan (hex, Base64, atau sha256=…). Alat ini menyatakan apakah signature tersebut cocok.
Pesan di-encode sebagai UTF-8 persis seperti yang diketik, termasuk spasi dan baris baru. Perhitungan memakai Web Crypto API di browser Anda; pesan dan kunci tidak pernah meninggalkan perangkat Anda.
Apa itu HMAC
HMAC (hash-based message authentication code, RFC 2104) menggabungkan kunci rahasia dengan fungsi hash:
HMAC(K, m) = H((K′ ⊕ opad) ‖ H((K′ ⊕ ipad) ‖ m))
dengan K′ adalah kunci yang diberi padding hingga ukuran blok hash (di-hash lebih dulu jika lebih panjang), sedangkan ipad/opad adalah konstanta tetap. Hanya orang yang mengetahui kunci yang bisa menghasilkan kode yang benar untuk sebuah pesan, dan perubahan apa pun pada pesan akan mengubah kodenya sepenuhnya. Itulah sebabnya HMAC dipakai untuk menandatangani webhook, permintaan API (misalnya AWS Signature Version 4), dan JSON Web Token HS256.
HMAC bukan enkripsi: pesannya tidak disembunyikan. HMAC juga bukan hash kata sandi; untuk menyimpan kata sandi, gunakan fungsi lambat seperti bcrypt atau Argon2.
Panjang hasil bergantung pada algoritmenya: 20 byte untuk SHA-1, 32 untuk SHA-256, 48 untuk SHA-384, dan 64 untuk SHA-512. HMAC-SHA1 masih dianggap aman sebagai MAC, tetapi pilih SHA-256 untuk sistem baru. Disarankan memakai kunci acak yang setidaknya sepanjang hasilnya (32 byte untuk HMAC-SHA256); kunci hex atau Base64 memungkinkan Anda memasukkan byte acak seperti itu secara langsung.
Memeriksa webhook GitHub
GitHub menandatangani setiap pengiriman dengan secret webhook Anda dan mengirim hasilnya di header X-Hub-Signature-256 sebagai sha256= diikuti HMAC-SHA256 hex dari body. Contoh di dokumentasi GitHub sendiri memakai secret It's a Secret to Everybody dan body Hello, World!; masukkan keduanya di sini dengan HMAC-SHA256 dan header-nya akan menampilkan:
X-Hub-Signature-256: sha256=757107ea0eb2509fc211221cce984b8a37570b6d7586c22c46f4379c8b043e17
Kolom perbandingan menerima baris header lengkap, nilai sha256=…, atau signature hex atau Base64 saja (Stripe, Shopify, dan Slack memakai skema serupa dengan header dan string bertanda tangan masing-masing). Untuk SHA-384 dan SHA-512, alat ini menampilkan header generik X-Signature, karena tidak ada standar umum.
Perbandingan waktu konstan
Server yang membandingkan signature dengan perbandingan string biasa berhenti di karakter pertama yang berbeda. Dengan mengukur waktu respons, penyerang bisa menebak signature yang valid satu karakter demi satu karakter. Perbandingan di alat ini memeriksa setiap byte apa pun hasilnya, seperti yang seharusnya dilakukan server dengan crypto.timingSafeEqual di Node.js, hmac.compare_digest di Python, atau hash_equals di PHP.
Pertanyaan yang sering diajukan
Mengapa HMAC saya berbeda dari yang dihitung server saya?
Penyebab umumnya adalah pesan yang berbeda (server menandatangani body mentah, sedangkan Anda menempel JSON yang sudah diformat ulang, atau baris barunya berbeda), kunci dengan Format kunci yang salah, atau algoritme lain. Satu spasi tambahan saja mengubah seluruh hasilnya.
Hasilnya sebaiknya hex atau Base64?
Keduanya meng-encode byte yang sama. GitHub memakai hex, sedangkan banyak API lain, seperti Shopify, memakai Base64. Gunakan format yang diharapkan sistem penerimanya.
Bisakah saya memakai kunci kosong?
Alat ini menerimanya dan memperingatkan Anda: dengan kunci kosong, siapa pun bisa menghitung HMAC yang sama, sehingga HMAC itu tidak membuktikan apa-apa.
Apakah HMAC-SHA1 sudah jebol seperti SHA-1?
Serangan collision pada SHA-1 tidak menjebol HMAC-SHA1, yang masih dianggap aman sebagai MAC. HMAC-SHA1 tetap didukung untuk sistem lama seperti header lama X-Hub-Signature, tetapi sistem baru sebaiknya memakai HMAC-SHA256 atau yang lebih kuat.
Apakah kunci rahasia saya aman di sini?
Kunci dan pesan hanya diproses di browser Anda dan tidak pernah dikirim ke mana pun. Meski begitu, perlakukan secret produksi dengan hati-hati dan ganti (rotate) jika Anda menduga secret itu telah bocor.
Alat terkait
- Generator Hash Buat hash MD5, SHA-1, SHA-256, dan SHA-512 dari teks atau file berukuran berapa pun, dan verifikasi checksum. Semuanya berjalan di browser Anda.
- JWT Decoder Dekode header dan payload JWT, baca exp, iat, dan nbf sebagai tanggal, serta verifikasi signature HS256, RS256, ES256, atau EdDSA di browser Anda.
- Encode dan Decode Base64 Encode dan decode Base64 gratis dengan dukungan penuh UTF-8 dan opsi base64url yang aman untuk URL. Berjalan sepenuhnya di browser, tanpa unggahan.
- Generator dan Pemeriksa Bcrypt Buat hash bcrypt dengan cost factor 4 hingga 14, cocokkan kata sandi dengan hash yang ada, dan lihat versi, cost, salt, serta digest-nya.