Skip to content

Generator JWT Secret Gratis — HS256/384/512

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.

Tanpa Pelacakan Berjalan di Browser Gratis
Secret Anda dihasilkan secara lokal dengan crypto.getRandomValues dan tidak pernah diunggah, dicatat, atau disimpan. Ia tetap di perangkat ini.
16 64

Perintah CLI yang setara

Ditinjau untuk kebenaran panjang kunci RFC 7518 §3.2, akurasi encoding RFC 4648 lintas base64url / base64 / hex, sumber CSPRNG (crypto.getRandomValues, tidak pernah Math.random), privasi tanpa-jaringan/tanpa-penyimpanan dari secret yang dihasilkan, dan aksesibilitas (kontrol berlabel, penyamaran tampilkan/sembunyikan, pengumuman pembaca layar saat membuat dan menyalin). — Tim Tooling Keamanan Go Tools · Jun 16, 2026

Apa Itu Generator JWT Secret?

Generator JWT secret menghasilkan kunci penandatanganan acak yang digunakan JSON Web Token bertanda-tangan HMAC untuk membuktikan bahwa ia tidak dirusak. Saat Anda menandatangani token dengan HS256, HS384, atau HS512, algoritma menjalankan HMAC atas header dan payload token menggunakan satu secret bersama; verifier menghitung ulang HMAC yang sama dengan secret yang sama dan menerima token hanya jika tanda tangannya cocok. Seluruh keamanan skema itu bertumpu pada secret yang panjang dan tidak dapat diprediksi — yang persis itulah yang dibuat alat ini: string acak berentropi tinggi, dihasilkan di browser Anda, dengan ukuran yang benar untuk algoritma yang Anda pilih.

Perlu dijelaskan dengan tepat apa yang dilakukan dan tidak dilakukan alat ini. Ia menghasilkan kunci secret — nilai yang Anda taruh di variabel lingkungan JWT_SECRET — bukan token jadi. Jika Anda ingin merangkai header dan payload lalu menandatanganinya menjadi JWT nyata, itu adalah tugas JWT Encoder; untuk membongkar token yang ada dan memverifikasi tanda tangannya, gunakan JWT Decoder. Anggap secret sebagai kunci dan encoder sebagai gembok yang ia operasikan: Anda menghasilkan kunci sekali, menyimpannya dengan aman, dan menggunakannya kembali untuk menandatangani dan memverifikasi banyak token.

Seberapa panjang sebaiknya kuncinya? Jawabannya ditetapkan oleh spesifikasi, bukan oleh preferensi. RFC 7518 §3.2 — standar JSON Web Algorithms — mengharuskan kunci HMAC setidaknya sebesar keluaran hash: "Sebuah kunci dengan ukuran yang sama dengan keluaran hash (misalnya, 256 bit untuk HS256) atau lebih besar HARUS digunakan." Itu memberi tabel rapi yang diikuti generator secara otomatis:

| Algorithm | HMAC | Min bytes | Min bits | hex chars | base64 chars | base64url chars | |-----------|------|-----------|----------|-----------|--------------|-----------------| | HS256 | HMAC-SHA-256 | 32 | 256 | 64 | 44 | 43 | | HS384 | HMAC-SHA-384 | 48 | 384 | 96 | 64 | 64 | | HS512 | HMAC-SHA-512 | 64 | 512 | 128 | 88 | 86 |

Jumlah karakter berasal dari encoding RFC 4648 atas panjang byte tersebut: hex menggandakan jumlah byte; base64 mengembang sebesar 4⁄3 dengan padding; base64url menghilangkan padding, sehingga kunci 32 byte adalah 43 karakter base64url alih-alih 44. base64url adalah encoding native JWT — alfabet aman-URL, tanpa padding — itulah sebabnya ia menjadi keluaran default di sini; secret dalam base64url dapat berada di header, URL, atau nilai konfigurasi tanpa escape.

Keacakan adalah bagian yang tidak boleh dikompromikan. Generator ini menarik byte-nya dari crypto.getRandomValues, generator angka pseudo-acak yang aman secara kriptografis dari browser, primitif yang sama yang menopang pembangkitan kunci Web Crypto. Ia tidak pernah menggunakan Math.random, yang cepat tetapi dapat diprediksi dan sama sekali tidak cocok untuk kunci penandatanganan — RNG yang dapat diprediksi berarti secret yang dapat ditebak, dan secret yang dapat ditebak berarti token yang dapat dipalsukan. Karena verifikasi HMAC terjadi secara lokal dengan secret bersama, penyerang yang menangkap token dapat melakukan brute-force terhadap kunci lemah secara offline tanpa batas laju; alat seperti hashcat (mode 16500) dan jwt_tool ada justru untuk melakukan ini. Kunci acak 32 byte berentropi penuh, sebaliknya, secara komputasi tidak terjangkau. Pelajarannya tegas: jangan pernah gunakan kata sandi, kata kamus, atau string yang diketik manual sebagai JWT secret — hasilkan yang acak.

Terakhir, menghasilkan kunci di sisi klien itu sendiri adalah properti keamanan. Secret penandatanganan tidak boleh pernah dikirim ke pihak ketiga, bahkan tidak ke situs yang membantu Anda membuatnya. Setiap byte di sini diproduksi dan di-encode di browser Anda; tidak ada yang diunggah, dicatat, atau disimpan. Saat Anda siap mengirim kunci, tombol Copy for .env memberi Anda baris JWT_SECRET=…, dan jika Anda perlu melipatnya ke dalam konfigurasi yang lebih besar, konverter JSON ke .env dapat membantu. Hasilkan, salin, simpan di secrets manager — dan rotasi dengan header kid serta jendela validitas yang tumpang tindih saat waktunya tiba.

// The secret you generate here goes straight into your signing code.
// Node.js with jsonwebtoken — the JWT_SECRET env var holds the key.
import jwt from 'jsonwebtoken';

const secret = process.env.JWT_SECRET; // e.g. base64url value from this tool

// Sign a token with HS256 (HMAC-SHA-256).
const token = jwt.sign({ sub: 'user-42', role: 'member' }, secret, {
  algorithm: 'HS256',
  expiresIn: '15m'
});

// Verify it — pin the algorithm to a whitelist; never trust the token's alg.
const payload = jwt.verify(token, secret, { algorithms: ['HS256'] });

// ---------------------------------------------------------------
// Python with PyJWT — same secret, same algorithm pinning.
// import jwt
// token = jwt.encode({"sub": "user-42"}, key, algorithm="HS256")
// payload = jwt.decode(token, key, algorithms=["HS256"])  # whitelist!

// ---------------------------------------------------------------
// Equivalent-strength CLI generation (32 bytes for HS256):
//   openssl rand -base64 32
//   node -e "console.log(require('crypto').randomBytes(32).toString('base64url'))"
//   python -c "import secrets; print(secrets.token_urlsafe(32))"

Fitur Utama

Panjang Kunci Sadar-Algoritma

Pilih HS256, HS384, atau HS512 dan generator menetapkan ukuran kunci minimum RFC 7518 §3.2 secara otomatis — 32, 48, atau 64 byte. Anda dapat meminta kunci yang lebih panjang, tetapi Anda tidak akan pernah secara tidak sengaja menyediakan kunci yang terlalu kecil yang melanggar spesifikasi atau yang akan ditolak pustaka yang ketat untuk ditandatangani.

Tiga Format Keluaran Aman-Teks

Dapatkan byte acak yang sama sebagai base64url (encoding native JWT yang aman-URL dan tanpa padding — default), base64 standar, atau hex, ditampilkan berdampingan. base64url adalah default teraman untuk JWT_SECRET; ganti format ketika loader atau pustaka tertentu mengharapkan yang lain. Entropinya identik di ketiganya.

Keacakan yang Aman Secara Kriptografis

Setiap secret ditarik dari crypto.getRandomValues, CSPRNG browser dan primitif di balik pembangkitan kunci Web Crypto. Tidak pernah Math.random. Itu menjamin kunci berentropi penuh tanpa struktur yang dapat diprediksi — properti yang menempatkan secret di luar jangkauan brute-force offline.

Copy for .env dalam Satu Klik

Copy for .env membungkus nilai dalam penetapan konvensional JWT_SECRET=…, satu baris, tanpa tanda kutip — siap ditempel ke file .env, Docker secret, atau variabel CI tanpa mengetik nama kunci secara manual. Copy biasa mengambil secret mentah saat Anda hanya membutuhkan nilainya.

Perintah CLI yang Setara

Sebuah panel mencetak one-liner openssl rand, Node crypto.randomBytes, dan Python secrets yang cocok untuk algoritma terpilih, sehingga Anda dapat mereproduksi kunci berkekuatan setara dalam skrip penyediaan atau Dockerfile. Sebagian besar alat pesaing menghilangkan ini; di sini sudah bawaan.

Penyamaran Tampilkan / Sembunyikan

Secret disamarkan secara default agar tetap di luar layar selama demo, tutorial, atau berbagi layar. Tampilkan dengan ikon mata hanya saat Anda siap menyalin. Tindakan Copy selalu menaruh secret asli ke clipboard, baik ditampilkan maupun disembunyikan.

100% Privat, Hanya-Browser

Secret dihasilkan, di-encode, dan ditampilkan sepenuhnya di perangkat Anda. Tidak ada permintaan jaringan, tidak ada pencatatan, tidak ada penyimpanan — pastikan di DevTools → Network. Kunci penandatanganan tidak boleh pernah mencapai pihak ketiga, dan di sini ia tidak pernah, yang menjadi seluruh alasan menghasilkannya di sisi klien.

Tersedia dalam 15 Bahasa

Seluruh antarmuka — label, instruksi, dan panduan — dilokalkan ke dalam 15 bahasa, sehingga alat ini dapat digunakan dan saran keamanannya jelas di mana pun tim Anda bekerja.

Contoh Terpandu

Buat HS256 secret dalam base64url (default)

Algorithm: HS256 · Format: base64url
3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0

HS256 menandatangani dengan HMAC-SHA-256, sehingga RFC 7518 §3.2 mengharuskan kunci minimal 32 byte (256 bit). Generator menarik 32 byte acak yang aman secara kriptografis dari crypto.getRandomValues dan meng-encode-nya sebagai base64url — alfabet tanpa padding dan aman-URL yang digunakan JWT itu sendiri. 32 byte menjadi string base64url sepanjang 43 karakter. Masukkan langsung nilainya ke JWT_SECRET. Setiap klik menghasilkan secret baru; tidak ada yang pernah sama dua kali.

Buat HS512 secret (64 byte / 512 bit)

Algorithm: HS512 · Format: base64url
k2Lp9XqA0mNbVcZ7rT4wYsHfGjUe8RoIdPlNkBvM3xQ1aWtCyZuS6FhEgJ (86 chars)

HS512 menggunakan HMAC-SHA-512, yang keluaran hash-nya 64 byte, sehingga RFC 7518 §3.2 mewajibkan kunci minimal 64 byte (512 bit). Alat ini mendeteksi algoritma dan menaikkan jumlah byte secara otomatis — Anda tidak perlu mengingat nilai minimumnya. 64 byte acak meng-encode menjadi string base64url sepanjang 86 karakter, 88 karakter dalam base64 standar, atau 128 karakter hex. Memilih algoritma yang lebih panjang di sini adalah cara satu-klik untuk menyediakan secret berentropi lebih tinggi.

Salin secret sebagai baris .env

Click "Copy for .env"
JWT_SECRET=3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0

Copy for .env membungkus nilai yang dihasilkan dalam penetapan konvensional JWT_SECRET=… sehingga Anda dapat menempelnya langsung ke file .env, Docker secret, atau variabel CI tanpa mengetik nama kunci secara manual. Nilainya tetap dalam satu baris tanpa tanda kutip di sekelilingnya — persis yang diharapkan loader bergaya dotenv. Perlu variabel tersemat dalam konfigurasi yang lebih luas? Pasangkan ini dengan konverter JSON ke .env yang ditautkan di bawah.

Reproduksi secret dari CLI (kekuatan setara)

Show the CLI command
openssl rand -base64 32

Panel CLI mencetak perintah openssl, Node, dan Python yang menarik jumlah byte acak aman yang sama untuk algoritma terpilih — openssl rand -base64 32 untuk HS256, …48 untuk HS384, …64 untuk HS512. Keluarannya adalah secret berkekuatan setara, bukan string yang identik byte demi byte: openssl memancarkan base64 standar dengan padding sedangkan alat ini default ke base64url, sehingga alfabet dan karakter akhirnya berbeda. Gunakan yang mana pun yang cocok dengan skrip penyediaan Anda; entropinya sama.

Tampilkan dan sembunyikan secret

Toggle the eye icon
•••••••••••••••••••••••••••••••••••••••••••  ↔  3sJ9aFq2kP7m…

Secret disamarkan secara default agar tidak dapat diintip dari balik bahu atau terekam oleh perekaman layar selama demo atau berbagi layar. Klik ikon mata untuk menampilkannya saat Anda siap menyalin, lalu sembunyikan lagi sesudahnya. Copy dan Copy for .env bekerja baik nilainya ditampilkan maupun disamarkan — secret asli selalu yang masuk ke clipboard Anda, tidak pernah titik-titiknya.

Cara Menggunakan Generator JWT Secret

  1. 1

    Pilih algoritma penandatanganan

    Pilih HS256, HS384, atau HS512. Generator langsung menerapkan panjang kunci minimum RFC 7518 §3.2 untuk varian HMAC tersebut — 32, 48, atau 64 byte — sehingga Anda tidak perlu mencari angkanya atau berisiko menggunakan kunci yang terlalu kecil.

  2. 2

    Pilih format keluaran

    base64url adalah default — encoding native JWT yang aman-URL dan tanpa padding. Beralih ke base64 standar jika loader mengharapkannya, atau hex ketika sistem hanya menerima karakter 0–f. Ketiganya meng-encode byte acak yang sama dengan entropi identik.

  3. 3

    Tampilkan dan salin secret

    Secret disamarkan secara default agar tidak terlihat di layar selama demo atau berbagi layar. Klik ikon mata untuk menampilkannya, lalu Copy untuk mengambil nilai mentah atau Copy for .env untuk menyalin baris JWT_SECRET=… yang siap untuk file .env atau variabel CI.

  4. 4

    Regenerasi sesuai kebutuhan

    Klik Regenerate untuk secret baru yang independen yang ditarik dari crypto.getRandomValues. Hasilkan satu per lingkungan — jangan pernah gunakan kembali kunci penandatanganan yang sama di development, staging, dan production.

  5. 5

    Gunakan padanan CLI atau lanjut ke penandatanganan

    Panel CLI menampilkan one-liner openssl, Node, dan Python yang cocok untuk penyediaan terskrip. Dengan secret di tangan, tandatangani token dengan JWT Encoder dan konfirmasi tanda tangannya dengan JWT Decoder.

Kesalahan JWT Secret yang Umum

Menggunakan kata sandi atau frasa pendek sebagai secret

String pilihan manusia memiliki entropi terlalu sedikit untuk kunci penandatanganan dan dapat dipulihkan secara offline dengan serangan kamus atau brute-force, setelah itu token apa pun dapat dipalsukan. Hasilkan secret acak berentropi penuh sebagai gantinya.

✗ Salah
JWT_SECRET=mySuperSecret123  →  low entropy, brute-forceable
✓ Benar
JWT_SECRET=3sJ9aFq2kP7mWcZ1xL0nVtRbYdGhU8eAoI4QpNlKj0  →  32 random bytes

Kunci lebih pendek daripada yang dibutuhkan algoritma

RFC 7518 §3.2 mewajibkan kunci HMAC setidaknya sepanjang keluaran hash. Kunci 16 byte untuk HS256 di bawah batas bawah 32 byte — ia melemahkan tanda tangan dan beberapa pustaka menolaknya secara langsung.

✗ Salah
16-byte key with HS256  →  below the 32-byte minimum
✓ Benar
32-byte key with HS256  →  meets RFC 7518 §3.2

Menghasilkan kunci dengan Math.random

Math.random tidak aman secara kriptografis — keluarannya dapat diprediksi, sehingga secret yang dibangun darinya dapat ditebak dan token yang ditandatanganinya dapat dipalsukan. Kunci penandatanganan harus berasal dari CSPRNG seperti crypto.getRandomValues.

✗ Salah
Math.random()-based key  →  predictable, unsafe
✓ Benar
crypto.getRandomValues key  →  full entropy

Meng-encode ulang secret sebelum menandatangani

Simpan dan umpankan string persis yang dihasilkan alat. Mendekode base64-nya menjadi byte di satu layanan tetapi memperlakukannya sebagai string literal di layanan lain memberi kedua sisi kunci yang berbeda, dan setiap pemeriksaan tanda tangan gagal.

✗ Salah
Service A: raw string · Service B: base64-decoded  →  signatures never match
✓ Benar
Both services use the identical stored string  →  signatures verify

Menggunakan kembali secret yang sama di semua lingkungan

Satu JWT_SECRET yang dibagikan oleh dev, staging, dan production berarti kebocoran di mana saja memalsukan token di mana-mana dan rotasi menjadi semua-atau-tidak-sama-sekali. Sediakan secret yang berbeda per lingkungan.

✗ Salah
Same JWT_SECRET in dev, staging, prod  →  one leak breaks all
✓ Benar
A unique secret per environment  →  blast radius contained

Memercayai alg token saat verifikasi

Membiarkan verifier menerima algoritma apa pun yang dideklarasikan token memungkinkan pemalsuan alg:none dan kebingungan HS/RS. Berikan daftar putih algoritma eksplisit terlepas dari sekuat apa secretnya.

✗ Salah
jwt.verify(token, secret)  →  accepts the token's alg
✓ Benar
jwt.verify(token, secret, { algorithms: ['HS256'] })  →  pinned

Siapa yang Menggunakan Alat Ini

Menyediakan JWT_SECRET untuk Layanan Baru
Sedang membangun API yang menerbitkan token bertanda-tangan HMAC? Pilih algoritma yang digunakan pustaka Anda, salin secret sebagai baris JWT_SECRET=…, dan masukkan ke lingkungan layanan. Hasilkan kunci yang berbeda untuk development, staging, dan production — jangan pernah berbagi satu secret lintas lingkungan.
Merotasi Secret yang Terkompromi atau Menua
Ketika kunci diduga bocor atau memang sudah waktunya dirotasi, hasilkan secret baru di sini, tetapkan kid baru, dan luncurkan dengan jendela tumpang tindih agar token aktif tetap terverifikasi hingga kedaluwarsa. Pada kompromi yang terkonfirmasi, rotasi segera dan hapus kunci lama dari set yang diterima.
Mengganti Kunci yang Lemah atau Diketik Manual
Mewarisi basis kode yang JWT_SECRET-nya berupa frasa pendek atau nilai contoh yang disalin? Kunci itu dapat di-brute-force secara offline. Hasilkan pengganti 32 byte berentropi penuh, tukar di balik jendela rotasi, dan tutup celah pemalsuan token sebelum dieksploitasi.
Menskrip Pembangkitan Kunci dalam Pipeline
Perlu kunci dibuat di CI atau Dockerfile alih-alih secara manual? Gunakan one-liner openssl, Node, atau Python dari panel CLI untuk mencetak secret berkekuatan setara di dalam skrip penyediaan Anda, dan gunakan halaman ini untuk memahami panjang byte dan encoding yang dihasilkan tiap perintah.
Mengajarkan Penandatanganan JWT dengan Aman
Pandu tim melalui cara kerja HS256 tanpa pernah mengekspos kunci production nyata — hasilkan secret sekali pakai di layar (tersamar hingga Anda menampilkannya), tandatangani token contoh dengan JWT Encoder, dan verifikasi dengan JWT Decoder agar seluruh siklus tanda-tangan-dan-verifikasi terlihat.
Membandingkan Ukuran Kunci HS256, HS384, dan HS512
Sedang memutuskan varian HMAC mana yang akan distandarkan? Beralih antar algoritma untuk melihat bagaimana panjang kunci yang dibutuhkan dan string yang di-encode bertambah — 43, 64, dan 86 karakter base64url — dan pilih kompromi kekuatan-versus-ukuran-token yang cocok untuk sistem Anda sebelum Anda menetapkannya ke konfigurasi.
Menghasilkan Kunci untuk Pengembangan Lokal
Perlu secret cepat dan valid untuk menjalankan alur autentikasi lokal? Hasilkan satu dalam sekali klik, salin untuk .env, dan Anda siap — dengan kunci CSPRNG nyata alih-alih placeholder yang akan Anda lupa ganti sebelum deploy.

Cara Kerja Generator

crypto.getRandomValues (CSPRNG)
Secret dihasilkan dengan mengisi Uint8Array dengan crypto.getRandomValues, generator angka pseudo-acak yang aman secara kriptografis dari Web Crypto. Itu adalah sumber entropi yang sama yang menopang pembangkitan kunci Web Crypto. Math.random tidak pernah digunakan di mana pun — ia dapat diprediksi secara statistik dan tidak cocok untuk kunci kriptografis apa pun.
Penyesuaian Ukuran Kunci RFC 7518 §3.2
Jumlah byte per algoritma mengikuti persyaratan JSON Web Algorithms bahwa kunci HMAC harus setidaknya sebesar keluaran hash: 32 byte untuk HS256 (SHA-256), 48 untuk HS384 (SHA-384), 64 untuk HS512 (SHA-512). Memilih algoritma menetapkan minimum; generator tidak akan memancarkan kunci di bawah batas bawah spesifikasi.
Encoding RFC 4648 (base64url / base64 / hex)
Byte mentah di-encode dengan alfabet RFC 4648. base64url menggunakan alfabet aman-URL tanpa padding (32 byte → 43 char), base64 standar menggunakan padding +, /, dan = (→ 44 char), dan hex menulis dua karakter per byte (→ 64 char). Mengganti format meng-encode ulang byte yang sama — entropi yang mendasarinya tidak berubah.
Mengapa base64url Menjadi Default
Komponen JWT sendiri di-encode base64url, dan alfabet aman-URL tanpa padding berarti secret dalam base64url tidak pernah perlu di-escape dalam header, URL, atau file konfigurasi. Karakter +, /, dan = di akhir base64 standar dapat rusak dalam konteks itu, sehingga base64url adalah default konservatif untuk JWT_SECRET.
Pemformatan Copy-for-.env
Copy for .env memancarkan JWT_SECRET= dalam satu baris tanpa tanda kutip di sekelilingnya — bentuk yang diuraikan loader bergaya dotenv tanpa modifikasi. Secret mentah tidak pernah menyertakan karakter yang memerlukan tanda kutip dalam file .env, sehingga barisnya aman ditempel apa adanya.
Perintah CLI Berkekuatan Setara, Bukan Identik Byte
Perintah openssl rand -base64 N, Node randomBytes(N).toString('base64url'), dan Python secrets.token_urlsafe(N) dari panel CLI semuanya menarik N byte acak aman untuk algoritma terpilih. Keduanya menghasilkan kunci berkekuatan setara, bukan string yang sama — openssl memancarkan base64 standar dengan padding, sehingga alfabet dan karakter akhirnya berbeda dari default base64url alat ini.

Praktik Terbaik JWT Secret

Sesuaikan Panjang Kunci dengan Algoritma
Gunakan minimal 32 byte untuk HS256, 48 untuk HS384, dan 64 untuk HS512, sebagaimana diharuskan RFC 7518 §3.2. Generator ini melakukannya untuk Anda, tetapi jika Anda mengukur kunci secara manual, jangan pernah di bawah panjang keluaran hash — kunci HMAC yang terlalu kecil melemahkan tanda tangan sekaligus dapat ditolak pustaka yang ketat.
Selalu Hasilkan dengan CSPRNG, Jangan Pernah Kata Sandi
JWT secret adalah kredensial mesin yang tidak perlu dihafal siapa pun, jadi belanjakan entropi penuh: gunakan kunci acak yang aman secara kriptografis, bukan passphrase, kata kamus, atau string yang diketik manual. Secret pilihan manusia adalah target termudah bagi serangan brute-force offline yang diotomatiskan alat pemecah JWT.
Gunakan Secret Unik per Lingkungan
Development, staging, dan production masing-masing harus memiliki JWT_SECRET sendiri. Berbagi satu kunci berarti kebocoran di lingkungan berisiko rendah memalsukan token di mana-mana, dan membuat rotasi menjadi semua-atau-tidak-sama-sekali. Hasilkan secret terpisah di sini untuk setiap lingkungan dan simpan masing-masing di scope secrets manager sendiri.
Kunci Algoritma Saat Anda Memverifikasi
Di sisi yang memverifikasi, selalu berikan daftar putih algoritma eksplisit — algorithms: ['HS256'] di jsonwebtoken, algorithms=["HS256"] di PyJWT — dan jangan pernah percayai field alg di dalam token. Menerima algoritma yang dideklarasikan token itu sendiri memungkinkan serangan klasik kebingungan-alg dan pemalsuan alg:none, terlepas dari sekuat apa secret Anda.
Rotasi dengan Header kid dan Kunci Tumpang Tindih
Tandai token yang ditandatangani dengan identifier kunci (kid) dan publikasikan kunci aktif melalui endpoint JWKS sehingga Anda dapat merotasi tanpa downtime: tandatangani token baru dengan kunci baru sambil tetap menerima yang lama hingga tokennya kedaluwarsa. Pada dugaan kompromi, lewati tumpang tindih dan cabut kunci lama segera.

Pertanyaan yang Sering Diajukan

Apakah JWT secret yang saya hasilkan dikirim ke server Anda?
Tidak. Secret dihasilkan sepenuhnya di browser Anda dengan crypto.getRandomValues, generator angka acak yang aman secara kriptografis dari platform. Byte-nya diproduksi di perangkat Anda, di-encode secara lokal, dan ditampilkan hanya kepada Anda. Tidak ada yang diunggah, tidak ada yang dicatat, tidak ada yang ditulis ke disk, dan tidak ada yang dikirim ke pihak ketiga mana pun — buka DevTools → Network dan Anda akan melihat nol permintaan terpicu saat Anda mengklik Regenerate atau Copy. Itu berarti kunci yang Anda hasilkan di sini adalah milik Anda sendiri begitu ia muncul; tidak ada server yang pernah mengamatinya. Inilah inti dari menghasilkan secret penandatanganan di sisi klien alih-alih di situs web yang, secara prinsip, dapat menyimpan salinan dari setiap kunci yang dibagikannya.
Bagaimana cara membuat JWT secret yang aman?
Tiga langkah. Pertama, pilih algoritma penandatanganan yang digunakan aplikasi Anda — HS256, HS384, atau HS512 — dan generator langsung menyesuaikan ukuran kunci ke minimum RFC 7518 §3.2 untuk varian tersebut (32, 48, atau 64 byte), sehingga Anda tidak pernah memilih angka secara manual atau berisiko menggunakan kunci yang terlalu kecil. Kedua, biarkan encoding pada base64url (format native JWT yang aman-URL) atau beralih ke base64 atau hex jika loader konfigurasi Anda mengharapkan salah satunya. Ketiga, klik Copy — atau Copy for .env untuk mendapatkan baris JWT_SECRET=… yang siap tempel — dan simpan nilainya di secrets manager atau variabel lingkungan, jangan pernah di kontrol sumber. Karena setiap byte berasal dari crypto.getRandomValues, kunci 32 byte sudah membawa 256 bit entropi, yang jauh di luar jangkauan serangan brute-force offline yang memecahkan secret pilihan manusia. Lebih suka command line? Alat ini juga mencetak one-liner openssl, Node, dan Python yang setara yang dapat Anda tempel ke terminal.
Seberapa panjang sebaiknya JWT secret HS256?
Minimal 32 byte (256 bit). RFC 7518 §3.2 — spesifikasi JSON Web Algorithms — menyatakan bahwa untuk tanda tangan HMAC "sebuah kunci dengan ukuran yang sama dengan keluaran hash (misalnya, 256 bit untuk HS256) atau lebih besar HARUS digunakan." HS256 menandatangani dengan HMAC-SHA-256 (hash 256-bit), sehingga kunci minimumnya 32 byte; HS384 menggunakan HMAC-SHA-384 dan membutuhkan minimal 48 byte (384 bit); HS512 menggunakan HMAC-SHA-512 dan membutuhkan minimal 64 byte (512 bit). Generator ini memilih minimum yang benar secara otomatis saat Anda memilih algoritma, dan Anda dapat meminta kunci yang lebih panjang. Kunci yang lebih pendek bukan hanya lebih lemah — ia melanggar spesifikasi dan beberapa pustaka akan menolak menandatangani dengannya.
Apa perbedaan antara base64url, base64, dan hex, dan mana yang sebaiknya saya pilih?
Ketiganya meng-encode byte acak yang sama; perbedaannya hanya pada alfabet karakter, bukan pada entropi. base64url adalah encoding native JWT — ia menggunakan alfabet aman-URL (- dan _ alih-alih + dan /) dan menghilangkan padding, sehingga tidak pernah perlu di-escape dalam token, URL, atau header. Itulah sebabnya ia menjadi default di sini. base64 standar menggunakan +, /, dan padding =; pilih ini ketika loader konfigurasi atau pustaka secara khusus mengharapkan base64 klasik. hex (base16) menulis setiap byte sebagai dua karakter 0–f, menghasilkan string yang lebih panjang tetapi tidak ambigu yang berguna ketika sistem menolak karakter non-alfanumerik. Untuk variabel lingkungan JWT_SECRET, base64url adalah default teraman; ketiganya bekerja selama Anda menyimpan string yang persis dan mengumpaninya kembali ke pustaka penandatanganan Anda tanpa perubahan.
Bisakah JWT secret yang lemah dipecahkan?
Bisa — dan ini adalah risiko terbesar dengan JWT yang ditandatangani HMAC. Karena HS256/384/512 menggunakan satu secret bersama, siapa pun yang memegang token dapat menjalankan serangan brute-force atau kamus offline terhadap tanda tangan tanpa batas laju dan tanpa kontak server. Alat seperti hashcat (mode 16500 menargetkan JWT) dan jwt_tool dibuat khusus untuk ini; pada GPU komoditas, secret berentropi rendah biasanya dapat jatuh dalam hitungan detik hingga jam, dan kata kamus atau kata sandi yang bocor dapat jatuh hampir seketika. Kunci acak 32 byte berentropi penuh dari generator ini jauh di luar jangkauan brute force. Begitu penyerang memulihkan secret, mereka dapat memalsukan token apa pun — termasuk yang mengklaim hak istimewa admin — sehingga kekuatan secret bukanlah opsional. Hasilkan kunci penandatanganan dengan CSPRNG, jangan pernah string pilihan manusia. Untuk pembahasan lebih dalam tentang serangan secret-lemah, kebingungan-alg, dan replay-token, lihat panduan kami untuk praktik terbaik keamanan JWT.
Bisakah saya menggunakan kata sandi sebagai JWT secret?
Bisa, tetapi sebaiknya tidak. Kata sandi yang dapat diingat manusia — bahkan passphrase panjang — membawa entropi jauh lebih sedikit daripada 32 byte acak, yang menjadikannya target realistis bagi serangan brute-force dan kamus offline yang dijelaskan di atas. JWT secret adalah kredensial mesin-ke-mesin; tidak ada yang perlu menghafalnya, jadi tidak ada alasan menukar entropi demi kemudahan diingat. Hasilkan secret acak di sini, simpan di secrets manager atau variabel lingkungan, dan biarkan aplikasi Anda membacanya. Jika Anda membutuhkan kredensial yang mudah diingat untuk tujuan lain, itu adalah tugas Generator Kata Sandi atau, untuk menyimpan kata sandi pengguna, hash satu arah dari Generator bcrypt — bukan untuk kunci penandatanganan token.
Bagaimana cara merotasi JWT secret tanpa merusak token yang aktif?
Rotasi dengan tumpang tindih alih-alih pemutusan mendadak. Tambahkan identifier kunci (header kid) ke token yang Anda tandatangani agar verifier tahu secret mana yang harus diperiksa, dan publikasikan kunci aktif Anda — biasanya melalui endpoint JWKS yang dibaca layanan Anda. Untuk merotasi: hasilkan secret baru di sini, mulai menandatangani token baru dengan kid baru sambil tetap menerima kunci sebelumnya untuk verifikasi, dan baru pensiunkan kunci lama setelah setiap token yang ditandatangani dengannya kedaluwarsa. Jendela tumpang tindih itu berarti tidak ada sesi valid yang dibatalkan di tengah jalan. Pada dugaan kompromi, lewati tumpang tindih yang mulus: rotasi segera, hapus kunci lama dari set yang diterima, dan paksa autentikasi ulang agar token yang bocor langsung berhenti terverifikasi.
Apa perbedaan kunci HMAC (HS*) dengan kunci RSA atau ECDSA (RS*/ES*)?
Keduanya menyelesaikan masalah yang sama dengan model kunci yang berlawanan. HS256/384/512 adalah algoritma HMAC: keduanya menggunakan satu secret simetris — jenis yang dihasilkan alat ini — yang menandatangani sekaligus memverifikasi, sehingga setiap pihak yang dapat memverifikasi token juga dapat memalsukannya. Itu sederhana dan cepat serta ideal ketika satu layanan menerbitkan sekaligus memeriksa tokennya sendiri. RS* (RSA) dan ES* (ECDSA) bersifat asimetris: keduanya menggunakan pasangan kunci, di mana kunci privat menandatangani dan kunci publik terpisah hanya memverifikasi. Anda menyerahkan kunci publik kepada siapa pun yang perlu memvalidasi token tanpa pernah mengekspos kunci penandatanganan — pilihan yang tepat ketika penyedia identitas menerbitkan token yang diverifikasi banyak layanan independen. Generator ini hanya menghasilkan secret simetris HMAC. Untuk merangkai dan menandatangani token nyata dengan kunci yang Anda hasilkan, gunakan JWT Encoder; untuk memeriksa dan memverifikasinya, gunakan JWT Decoder.