ToolDeck

رمزگذار JWT

ساخت و امضای JSON Web Token با HS256، HS384، HS512

هدر

به‌صورت محلی اجرا می‌شود · جای‌گذاری اسرار امن است

پیلود

به‌صورت محلی اجرا می‌شود · جای‌گذاری اسرار امن است

کلید مخفی

به‌صورت محلی اجرا می‌شود · جای‌گذاری اسرار امن است

JWT رمزگذاری‌شده

Output will appear here…

کلید مخفی شما هرگز مرورگر را ترک نمی‌کند. تمام عملیات امضا در سمت کلاینت انجام می‌شود.

همچنین امتحان کنید:رمزگشای JWT

رمزگذاری JWT چیست؟

رمزگذاری JWT فرایند ساخت یک JSON Web Token است — یک رشته فشرده و URL-safe که مجموعه‌ای از کلیم‌ها را با یک کلید رمزنگاری امضا کرده نگه می‌دارد. نتیجه یک توکن سه‌بخشی (header.payload.signature) است که بر اساس RFC 7519 تعریف شده و سرورها می‌توانند بدون نگهداری وضعیت نشست آن را تأیید کنند. رمزگذاری JWT آنلاین به شما امکان می‌دهد توکن‌ها را مستقیماً در مرورگر برای آزمایش و توسعه بسازید و امضا کنید.

هدر الگوریتم امضا (مثلاً HS256) و نوع توکن را اعلام می‌کند. پیلود حاوی کلیم‌ها است — جفت‌های کلید-مقدار مانند موضوع (sub)، زمان انقضا (exp) و هر داده سفارشی که برنامه شما نیاز دارد. هر دو بخش به‌صورت JSON سریال می‌شوند، سپس با base64url رمزگذاری می‌گردند. امضا روی هدر و پیلود رمزگذاری‌شده با کلید مخفی محاسبه می‌شود و هر سه بخش را به هم متصل می‌کند.

برخلاف کوکی‌های نشست، JWT‌ها خودکفا هستند: تأییدکننده نیازی به پرس‌وجو از پایگاه داده یا فراخوانی سرویس خارجی ندارد. این ویژگی باعث شده احراز هویت مبتنی بر JWT در REST API‌ها، میکروسرویس‌ها و برنامه‌های تک‌صفحه‌ای که مجوزدهی بدون وضعیت تأخیر را کاهش داده و مقیاس‌پذیری افقی را ساده می‌کند، بسیار محبوب باشد.

چرا از رمزگذار JWT استفاده کنیم؟

تولید JWT به‌صورت دستی نیازمند رمزگذاری base64url، سریال‌سازی JSON و محاسبه HMAC است. این ابزار هر سه مرحله را فوری انجام می‌دهد تا بتوانید روی درستی کلیم‌ها تمرکز کنید.

تولید فوری توکن
هدر، پیلود و کلید مخفی را ویرایش کنید — JWT امضاشده بلادرنگ به‌روزرسانی می‌شود. بدون مرحله ساخت، نصب کتابخانه یا کد اضافی.
🔒
الگوریتم‌های چندگانه HMAC
با یک کلیک بین HS256، HS384 و HS512 جابجا شوید. هدر به‌طور خودکار به‌روزرسانی شده و امضا بلافاصله دوباره محاسبه می‌شود.
🛡️
پردازش با اولویت حریم خصوصی
تمام عملیات امضا در مرورگر شما با استفاده از Web Crypto API انجام می‌شود. کلید مخفی و داده پیلود هرگز دستگاه شما را ترک نمی‌کنند — بدون سرور، بدون لاگ، بدون ریسک.
📋
دستیارهای کلیم با یک کلیک
تایم‌استمپ‌های iat، exp+1h یا exp+24h را با یک دکمه اضافه کنید. نیازی به محاسبه دستی تایم‌استمپ Unix یا جستجوی زمان epoch فعلی نیست.

موارد استفاده از رمزگذار JWT

آزمایش احراز هویت در فرانت‌اند
توکن‌هایی با کلیم‌ها و زمان انقضای مشخص تولید کنید تا جریان‌های ورود، منطق تجدید توکن و محافظ‌های مسیر محافظت‌شده را بدون اجرای سرور احراز هویت بک‌اند آزمایش کنید.
توسعه API بک‌اند
توکن‌های آزمایشی با کلیم‌های سفارشی sub، aud و scope بسازید تا میان‌افزار مجوزدهی، کنترل دسترسی مبتنی بر نقش و بررسی مجوزها را در حین توسعه محلی آزمایش کنید.
خطوط لوله DevOps و CI/CD
توکن‌های سرویس کوتاه‌مدت برای اسکریپت‌های استقرار، آزمون‌های یکپارچگی یا ارتباط بین سرویس‌ها تولید کنید که در آن‌ها یک جریان کامل OAuth پیچیدگی غیرضروری ایجاد می‌کند.
آزمایش دستی و تضمین کیفیت
توکن‌هایی با کلیم‌های مرزی بسازید — توکن‌های منقضی‌شده، فیلدهای ناقص، مخاطبان اشتباه — تا تأیید کنید که API شما پاسخ‌های HTTP 401 یا 403 صحیح را برمی‌گرداند.
ممیزی امنیتی
توکن‌هایی با الگوریتم‌های مختلف و طول‌های کلید مخفی متفاوت بسازید تا اعتبارسنجی کنید که منطق تأیید شما امضاهای ضعیف یا ناسازگار را به درستی رد می‌کند.
یادگیری و نمونه‌سازی اولیه
دانشجویان و توسعه‌دهندگانی که با JWT آشنا نیستند می‌توانند با فیلدهای هدر، ساختارهای کلیم و الگوریتم‌های امضا آزمایش کنند تا نحوه عملکرد هر بخش از توکن را درک کنند.

مقایسه الگوریتم‌های HMAC: HS256 در برابر HS384 در برابر HS512

هر سه الگوریتم از HMAC (کد احراز هویت پیام مبتنی بر هش) با یک کلید مخفی مشترک استفاده می‌کنند. تفاوت در تابع هش زیرین است که طول امضا و حاشیه امنیتی را تحت تأثیر قرار می‌دهد. برای اکثر برنامه‌ها HS256 امنیت کافی فراهم می‌کند. HS384 یا HS512 را انتخاب کنید وقتی الزامات انطباق (مثلاً FIPS-140) هش قوی‌تری را الزامی می‌کنند یا وقتی توکن‌های شما تصمیمات مجوزدهی با ارزش بالا حمل می‌کنند.

الگوریتمهشامضاسرعتاستفاده معمول
HS256SHA-25632 BFastestGeneral purpose, default for most libraries
HS384SHA-38448 BFastHigher security margin, FIPS-140 compliant
HS512SHA-51264 BFastMaximum HMAC security, large payloads

مرجع کلیم‌های استاندارد JWT

RFC 7519 هفت کلیم ثبت‌شده را تعریف می‌کند. هیچ‌کدام الزامی نیستند، اما استفاده صحیح از آن‌ها قابلیت همکاری و امنیت را بهبود می‌بخشد. کلیم exp به‌ویژه مهم است — توکن‌های بدون انقضا تا زمانی که کلید مخفی تعویض نشود، نامحدود معتبر هستند.

کلیمنامتوضیحمثال
issIssuerWho issued the token"auth.example.com"
subSubjectWho the token represents"user-123"
audAudienceIntended recipient service"api.example.com"
expExpirationUnix timestamp — token invalid after this time1717203600
nbfNot BeforeUnix timestamp — token invalid before this time1717200000
iatIssued AtUnix timestamp when the token was created1717200000
jtiJWT IDUnique token identifier for revocation tracking"a1b2c3d4"

رمزگذاری JWT در کد

این مثال‌ها نحوه ساخت و امضای JWT به‌صورت برنامه‌نویسی را نشان می‌دهند. هر قطعه کد یک توکن معتبر امضاشده با HS256 تولید می‌کند. برای سیستم‌های تولیدی، همیشه کلیم exp را تنظیم کنید و از یک کلید مخفی تصادفی رمزنگاری‌شده با حداقل ۲۵۶ بیت استفاده کنید.

JavaScript (Web Crypto API)
async function signJWT(payload, secret, alg = 'HS256') {
  const header = { alg, typ: 'JWT' }
  const enc = new TextEncoder()

  // Base64url encode header and payload
  const b64url = (obj) =>
    btoa(JSON.stringify(obj)).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')

  const h = b64url(header)
  const p = b64url(payload)

  // Sign with HMAC-SHA256
  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(`${h}.${p}`))
  const s = btoa(String.fromCharCode(...new Uint8Array(sig)))
    .replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')

  return `${h}.${p}.${s}`
}

// Usage
const token = await signJWT(
  { sub: 'user-123', name: 'Alice', iat: Math.floor(Date.now() / 1000) },
  'your-256-bit-secret'
)
// → "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOi..."
Python (PyJWT)
import jwt
import time

payload = {
    "sub": "user-123",
    "name": "Alice",
    "iat": int(time.time()),
    "exp": int(time.time()) + 3600,  # expires in 1 hour
}

# Sign with HS256 (default)
token = jwt.encode(payload, "your-256-bit-secret", algorithm="HS256")
# → "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOi..."

# Verify and decode
decoded = jwt.decode(token, "your-256-bit-secret", algorithms=["HS256"])
# → {"sub": "user-123", "name": "Alice", "iat": 1717200000, "exp": 1717203600}
Node.js (jsonwebtoken)
const jwt = require('jsonwebtoken')

const payload = {
  sub: 'user-123',
  name: 'Alice',
  role: 'admin',
}

// Sign — iat is added automatically
const token = jwt.sign(payload, 'your-256-bit-secret', {
  algorithm: 'HS256',
  expiresIn: '1h',    // sets exp claim
  issuer: 'auth.example.com',  // sets iss claim
})

// Verify
const decoded = jwt.verify(token, 'your-256-bit-secret')
// → { sub: 'user-123', name: 'Alice', role: 'admin', iat: ..., exp: ... }
Go (golang-jwt)
package main

import (
    "fmt"
    "time"
    "github.com/golang-jwt/jwt/v5"
)

func main() {
    claims := jwt.MapClaims{
        "sub":  "user-123",
        "name": "Alice",
        "iat":  time.Now().Unix(),
        "exp":  time.Now().Add(time.Hour).Unix(),
    }

    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    signed, _ := token.SignedString([]byte("your-256-bit-secret"))
    fmt.Println(signed)
    // → eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOi...
}

سؤالات متداول

تفاوت رمزگذاری JWT و رمزگشایی JWT چیست؟
رمزگذاری JWT یک توکن امضاشده از هدر، پیلود و کلید مخفی می‌سازد. رمزگشایی JWT فرایند را معکوس می‌کند — هدر و پیلود رمزگذاری‌شده با base64url را به JSON بازمی‌گرداند. رمزگشایی به کلید مخفی نیاز ندارد؛ رمزگذاری همیشه به آن نیاز دارد زیرا امضا باید محاسبه شود.
طول کلید مخفی JWT باید چقدر باشد؟
برای HS256 از کلید مخفی با حداقل ۲۵۶ بیت (۳۲ بایت) استفاده کنید. برای HS384 حداقل ۳۸۴ بیت (۴۸ بایت) و برای HS512 حداقل ۵۱۲ بیت (۶۴ بایت). کلیدهای کوتاه‌تر از نظر فنی توسط اکثر کتابخانه‌ها پذیرفته می‌شوند اما امنیت مؤثر امضای HMAC را کاهش می‌دهند. کلیدها را با یک مولد تصادفی امن رمزنگاری‌شده تولید کنید، نه با عبارت عبوری انتخاب‌شده توسط انسان.
آیا استفاده از این ابزار با کلیدهای مخفی واقعی امن است؟
این ابزار همه چیز را در مرورگر شما با استفاده از Web Crypto API پردازش می‌کند — هیچ داده‌ای به هیچ سروری ارسال نمی‌شود. با این حال، به‌عنوان یک اصل کلی امنیتی از قرار دادن کلیدهای مخفی تولیدی در هر ابزار وب خودداری کنید. برای مدیریت کلید در محیط تولید از متغیرهای محیطی یا یک مدیر رمز مانند HashiCorp Vault یا AWS Secrets Manager استفاده کنید.
آیا باید از HS256 یا RS256 برای برنامه خود استفاده کنم؟
از HS256 استفاده کنید وقتی همان سرویس هم توکن می‌سازد هم تأیید می‌کند — سریع‌تر و ساده‌تر است. از RS256 (نامتقارن) استفاده کنید وقتی سرویس‌های شخص ثالث نیاز به تأیید توکن‌های شما بدون توانایی ساخت آن‌ها دارند. RS256 در ارائه‌دهندگان OAuth 2.0، OpenID Connect و معماری‌های SaaS چندمستأجری رایج است.
چرا JWT من بلافاصله پس از ساخت منقضی می‌شود؟
کلیم exp از تایم‌استمپ Unix بر حسب ثانیه استفاده می‌کند، نه میلی‌ثانیه. اگر exp را روی Date.now() (که میلی‌ثانیه برمی‌گرداند) تنظیم کنید، توکن ظاهراً هزاران سال در آینده منقضی می‌شود — یا اگر به اشتباه از مقدار میلی‌ثانیه در جایی که ثانیه انتظار می‌رود استفاده کنید، کتابخانه‌ها ممکن است آن را به‌عنوان منقضی‌شده تفسیر کنند. همیشه از Math.floor(Date.now() / 1000) در JavaScript یا int(time.time()) در Python استفاده کنید.
آیا می‌توانم داده حساس را در پیلود JWT قرار دهم؟
می‌توانید، اما نباید. پیلود JWT با base64url رمزگذاری شده، نه رمزنگاری شده — هر کسی که توکن را دارد می‌تواند کلیم‌ها را بخواند. رمز عبور، شماره کارت اعتباری یا اطلاعات شخصی را در پیلود ذخیره نکنید. اگر باید اطلاعات حساس را شامل شوید، از JWE (JSON Web Encryption) طبق تعریف RFC 7516 استفاده کنید که کل پیلود را رمزنگاری می‌کند.
اگر پیلود را بعد از امضا تغییر دهم چه اتفاقی می‌افتد؟
امضا نامعتبر می‌شود. امضای HMAC روی بایت‌های دقیق هدر و پیلود رمزگذاری‌شده محاسبه می‌شود. هر تغییری — حتی اضافه کردن یک فاصله یا تغییر یک کاراکتر — امضای کاملاً متفاوتی تولید می‌کند. یک تأییدکننده به‌درستی پیاده‌سازی‌شده توکن را با خطای عدم تطابق امضا رد می‌کند.