مشفر JWT
أنشئ وقّع JSON Web Tokens باستخدام HS256 و HS384 و HS512
الرأس
البيانات
المفتاح السري
JWT المُشفّر
مفتاحك السري لا يترك متصفحك. يتم إجراء جميع التوقيعات على جانب العميل.
ما هو تشفير JWT؟
تشفير JWT هو عملية إنشاء JSON Web Token — سلسلة نصية آمنة للعنوان URL تحمل مجموعة من الدعاوى موقعة بمفتاح تشفيري. والنتيجة هي رمز مكون من ثلاثة أجزاء (رأس. حمولة. توقيع) معرّف في RFC 7519 يمكن للخوادم التحقق منه دون الحفاظ على حالة الجلسة.
يُعلن الـ header عن خوارزمية التوقيع (مثلًا HS256) ونوع الرمز. يحتوي الـ payload على المطالبات — أزواج مفتاح-قيمة كموضوع الرمز (sub) ووقت الانتهاء (exp) وأي بيانات مخصصة يحتاجها تطبيقك. يُسلسَل كلا الجزأين بصيغة JSON ثم يُشفَّران بـ base64url. تُحسَب التوقيعة فوق الـ header والـ payload المُشفَّرَين باستخدام مفتاح سري، مما يربط الأجزاء الثلاثة معًا.
خلافًا لملفات تعريف ارتباط الجلسة، تكتفي JWT بذاتها: لا يحتاج المُحقِّق إلى الاستعلام عن قاعدة البيانات أو استدعاء خدمة خارجية. هذا ما جعل المصادقة المبنية على JWT شائعةً في REST API والخدمات المصغَّرة وتطبيقات الصفحة الواحدة، حيث يُقلِّل التفويض عديم الحالة من زمن الاستجابة ويُبسِّط التوسع الأفقي.
لماذا تستخدم مُرمِّز JWT؟
إنشاء JWT يدويًا يتطلب تشفير base64url وتسلسل JSON وحساب HMAC. تتولى هذه الأداة الخطوات الثلاث فورًا حتى تتفرغ للتركيز على ضبط المطالبات.
حالات استخدام مُرمِّز JWT
HS256 مقابل HS384 مقابل HS512: مقارنة خوارزميات HMAC
تستخدم الخوارزميات الثلاث HMAC (رمز مصادقة الرسائل القائم على الدالة الهاشية) مع سر مشترك. الفرق هو دالة الهاش الأساسية التي تؤثر على طول التوقيعة وهامش الأمان. لمعظم التطبيقات، يوفر HS256 أمانًا كافيًا. اختر HS384 أو HS512 عندما تستلزم متطلبات الامتثال (مثل FIPS-140) هاشًا أقوى أو حين تحمل رموزك قرارات تفويض عالية القيمة.
| الخوارزمية | الهاش | التوقيعة | السرعة | الاستخدام النموذجي |
|---|---|---|---|---|
| HS256 | SHA-256 | 32 B | Fastest | General purpose, default for most libraries |
| HS384 | SHA-384 | 48 B | Fast | Higher security margin, FIPS-140 compliant |
| HS512 | SHA-512 | 64 B | Fast | Maximum HMAC security, large payloads |
مرجع مطالبات JWT القياسية
يُعرِّف RFC 7519 سبعة مطالبات مسجَّلة. لا شيء منها إلزامي، لكن استخدامها الصحيح يُحسِّن التشغيل البيني والأمان. مطالبة exp مهمة بشكل خاص — الرموز الخالية من وقت انتهاء الصلاحية صالحة إلى أجل غير مسمى إذا لم يُدَر السر.
| المطالبة | الاسم | الوصف | مثال |
|---|---|---|---|
| iss | Issuer | Who issued the token | "auth.example.com" |
| sub | Subject | Who the token represents | "user-123" |
| aud | Audience | Intended recipient service | "api.example.com" |
| exp | Expiration | Unix timestamp — token invalid after this time | 1717203600 |
| nbf | Not Before | Unix timestamp — token invalid before this time | 1717200000 |
| iat | Issued At | Unix timestamp when the token was created | 1717200000 |
| jti | JWT ID | Unique token identifier for revocation tracking | "a1b2c3d4" |
ترميز JWT في الكود
تُظهر هذه الأمثلة كيفية إنشاء JWT وتوقيعها برمجيًا. كل مقتطف ينتج رمزًا صالحًا موقَّعًا بـ HS256. في أنظمة الإنتاج، احرص دائمًا على تعيين مطالبة exp واستخدام سر عشوائي تشفيري بطول 256 بت على الأقل.
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..."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}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: ... }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...
}