فاكّ تشفير JWT
تطويرفكّ تشفير JSON Web Token (الترويسة والحِمل) وفحص انتهاء صلاحيته وتوقيعه. فك تشفير فقط — لا يتم التحقق من التوقيع.
- أُصدر في (iat)
- ليس قبل (nbf)
- ينتهي في (exp)
- التوقيع
في هذه الصفحة
ما هو الـ JWT؟#
الـ JWT (JSON Web Token، المعرّف في RFC 7519) رمزٌ مختصر آمن للاستخدام في الروابط مُصمَّم لحمل الادّعاءات بين طرفَين. وهو البيان الذي يُرسله متصفّحك إلى واجهة برمجة تطبيقات بعد تسجيل الدخول، وتأكيد الهوية الذي يُسلّمه مزوّد OAuth إلى تطبيقٍ معتمِد، والغلاف الذي تسافر فيه معظم تدفّقات الجلسة والتحكّم في الوصول الحديثة. جاذبيته أنّ الادّعاءات — مَن المستخدم، وماذا يقدر عليه، ومتى تنتهي صلاحية الرمز — تسافر داخل الرمز نفسه بصيغة JSON، فيستطيع المستقبِل قراءتها دون بحث في قاعدة البيانات.
يحوي JWT ثلاثة أجزاء بالضبط مرمَّزة بـ base64url ومفصولة بنقاط: header.payload.signature. تُسمّي الترويسة الخوارزمية ونوع الرمز. أمّا الحمولة فهي كائن JSON من الادّعاءات — ادّعاءات مسجَّلة مثل sub (الموضوع) وiat (أُصدر في) وexp (الانتهاء) وnbf (ليس قبل)، مع أيّ ادّعاءات مخصّصة يضيفها تطبيقك. والتوقيع هو ما حسبه المُصدِر على الجزأين الآخرَين بسرّ أومفتاح خاصّ؛ والتحقّق منه هو ما يُثبت أنّ الرمز لم يُعبَث به.
تفكّ هذه الصفحة JWT وتفحصه. تُقسّم الأجزاء الثلاثة، وتفكّ ترميز base64url للترويسة والحمولة إلى JSON مقروء، وتُبرز الادّعاءات الزمنية القياسية كطوابع زمنية مقروءة، وتُظهر شارة حالة حيّة (صالح أومنتهٍ أوليس ساريًا بعد). وهي عمدًا لا تُحقِّق التوقيع — فذاك يتطلّب سرّ المُصدِر أومفتاحه العمومي وهو خارج نطاق أداةٍ تعمل 100% من جهة العميل. ويُعرَض مقطع التوقيع خامًا، كما هو مُستلَم.
كيفية الاستخدام#
- الصق رمزك في مربّع الإدخال على اليسار. يجب أن يكون ثلاثة مقاطع مفصولة بنقاط؛ ويُقصّ الفراغ المحيط به تلقائيًّا.
- اضغط مثال لتحميل رمز نموذجي مدمج (بـ
iat/exp/nbf) إن أردت فقط رؤية كيف يعمل التخطيط. - اضغط مسح لإفراغ الإدخال ولوحات النتائج.
- اقرأ اللوحة اليمنى:
- شارة الحالة في الأعلى —
صالحأخضر، أومنتهٍ، أوليس ساريًا بعد— بناءً على ادّعاءَيnbfوexpمقارنةً بالوقت الحالي. - بطاقة الترويسة (مع الخوارزمية في شريط عنوانها، مثل
HS256). - بطاقة الحمولة، منسَّقة بشكل جميل كـ JSON.
- قائمة الادّعاءات الزمنية — أُصدر في، ليس قبل، ينتهي في — كلٌّ مرسوم كطابع Unix زمنيّ وكتاريخ مقروء.
- مقطع التوقيع، معروض خامًا لأنّه ما يزال بايتات مرمَّزة بـ base64url.
- شارة الحالة في الأعلى —
- إن كان الرمز معوَّبًا، يُخبرك سطر الحالة الأحمر هل فشل في فحص شكل المقاطع الثلاثة، أم في فكّ base64url، أم في تحليل JSON.
الميزات الرئيسية#
- حالة الادّعاءات الزمنية الحيّة. تقرأ
iatوnbfوexpوتُخبرك هل الرمز صالحٌ الآن، أم منتهٍ فعلًا، أم ليس ساريًا بعد — الأسئلة الثلاثة التي تطرحها فعلًا أثناء تنقيح ثغرة تسجيل دخول. - تواريخ مقروءة. أرقام حقبة Unix مثل
1700000000معروضة بجانب تاريخ UTC الذي تمثّله، فتتوقّف عن حساب الحقبة ذهنيًّا. - الخوارزمية ظاهرة. تُسحب قيمة
algمن الترويسة إلى شريط عنوان بطاقة الترويسة، فترى فورًا هل تُمسكHS256أمRS256أمشيئًا غير متوقّع. - فكّ آمن لـ UTF-8. تُفكّ مقاطع base64url كبايتات عبر
TextDecoder، فتُعرض الادّعاءات غير ASCII (الأسماء والأدوار بحروف أخرى) بشكل صحيح بدلًا من رموز مشوّهة. - فكّ فقط — لا تحقّق أبدًا. لا تطلب الأداة سرًّا قط، ممّا يجعلها آمنة للّصق رموزٍ لا تثق بها كليًّا: لا يُرسَل شيء إلى أيّ مكان، والتوقيع معروض لكن غير مفحوص.
مثال عملي#
اضغط مثال فيمتلئ الإدخال برمزٍ تُفكّ ترويسته إلى:
{
"alg": "HS256",
"typ": "JWT"
}
وتُفكّ حمولته إلى:
{
"sub": "1234567890",
"name": "ArpGate Demo",
"iat": 1700000000,
"exp": 4102444800,
"nbf": 1699999000
}
ثمّ تُظهر قائمة الادّعاءات الزمنية:
Issued at 1700000000 (2023-11-14 22:13:20 UTC)
Not before 1699999000 (2023-11-14 21:56:40 UTC)
Expires 4102444800 (2100-01-01 00:00:00 UTC)
وتقرأ شارة الحالة صالح، لأنّ الوقت الحالي بعد nbf وقبل exp. أمّا مقطع التوقيع فيُعرض كسلسلة حرفية c2FtcGxlLXNpZ25hdHVyZS1ub3QtdmVyaWZpZWQ — التي تُفكّ إلى النصّ «sample-signature-not-verified»، علامة متعمّدة على أنّ توقيع هذا الرمز توضيحيّ وليس مخرَج HMAC-SHA256 حقيقيًّا.
تلك النقطة الأخيرة هي أهمّ ما يجب فهمه عن هذه الأداة: الرمز الذي يُفكّ بسلاسة ليس بالضرورة رمزًا موثوقًا. يستطيع أيّ أحد تزييف الترويسة والحمولة؛ والتوقيع وحده، بعد التحقّق منه ضدّ سرّ المُصدِر أومفتاحه العمومي، هو ما يُثبت الأصالة. استخدم هذه الصفحة لقراءة الادّعاءات وتنقيح النوافذ الزمنية؛ وحقِّق التوقيعات في خادمك الخلفيّ الفعلي.
الأسئلة الشائعة#
هل تستطيع هذه الأداة إخباري هل الـ JWT أصيل؟#
لا، وذلك بالتصميم. فالفكّ يقرأ JSON داخل الرمز فقط — ولا يُثبت أنّ المُصدِر هو مَن يُدّعى أنّه أصدره. وللتحقّق من الأصالة تحتاج المفتاح المناسب لـ alg (سرّ مشترك لـ HS256، المفتاح العمومي للمُصدِر لـ RS256/ES256) وإجراء تحقّق على خادم خلفيّ موثوق. لا تُعامل رمزًا فُكّ بسلاسة كرمزٍ مُتحقَّق منه.
تقول الحالة «منتهٍ». هل أستطيع تجديد الرمز هنا؟#
لا. التجديد يعني نداء نقطة نهاية التجديد على خادم المصادقة للحصول على رمز وصول جديد — وهي عملية شبكة لا تستطيع هذه الصفحة الثابتة من جهة العميل أداءها ولا ينبغي. ما تستطيع فعله هنا تأكيد متى انتهى الرمز القديم تحديدًا، وهو عادةً القرينة التي احتجتها.
ما الفرق بين iat وnbf وexp؟#
iat (أُصدر في) متى خُلق الرمز — معلوماتيّ. nbf (ليس قبل) أبكر وقت ينبغي قبول الرمز فيه؛ وقبل nbf ينبغي للخادم المُحقِّق رفضه ولو كان التوقيع صالحًا. exp (الانتهاء) هو الحدّ الصارم الذي يُرفض بعده الرمز وجوبًا. الرمز الجيّد التكوين يجعل nbf ≤ iat ≈ الآن وexp في المستقبل القريب (دقائق لرموز الوصول، أطول لرموز التجديد).
حمولتي تحوي أحرفًا غير ASCII وتبدو مشوّشة في مكان آخر. لماذا تظهر صحيحة هنا؟#
لأنّ بعض فوّاكات الشيفرة تُعامل محرف base64url الواحد كبايتٍ خطأً بدل فكّه إلى بايتات خام أولًا. تفكّ هذه الصفحة إلى Uint8Array ثمّ تُمرِّرها عبر TextDecoder الذي يُفسّر البايتات UTF-8 سليمًا. وهذا هو الأسلوب الصحيح، ولهذا تظهر الأسماء والأدوار والنطاقات بأيّ كتابة كما كُتبت.