🎫
← العودة للأدلة

كيفية التحقق من تواقيع JWT: HS256 و RS256 و ES256

· وسوم: jwt-verification, jwt-signature, hs256, rs256, token-validation

كيفية التحقق من تواقيع JWT

يحمل JWT مطالباته بنص عادي. الشيء الوحيد الذي يمنع التزوير هو التوقيع. بدون التحقق، يمكن للمهاجم صياغة رموز عشوائية وانتحال أي مستخدم. يغطي هذا الدليل خوارزميات توقيع JWT الثلاث الأكثر شيوعًا وكيفية التحقق من كل منها.

عملية التحقق

بغض النظر عن الخوارزمية، يتبع التحقق من توقيع JWT نفس الخطوات:

  1. قسّم الرمز عند . لاستخراج header و payload و signature.
  2. قم بفك ترميز header بـ base64url لقراءة حقل alg.
  3. أعد حساب التوقيع من header و payload باستخدام الخوارزمية والمفتاح.
  4. قارن التوقيع المعاد حسابه مع توقيع الرمز.
  5. إذا تطابقا، يكون الرمز أصليًا.

HS256 (HMAC-SHA256)

HS256 هي خوارزمية متماثلة — نفس المفتاح السري ينشئ ويتحقق من التوقيع.

signature = HMACSHA256(
  base64urlEncode(header) + "." + base64urlEncode(payload),
  secret
)

للتحقق، أعد حساب HMAC باستخدام المفتاح السري المشترك وقارن:

Token:   header.payload.sig
Secret:  "my-shared-secret"

1. Compute: HMACSHA256("header.payload", "my-shared-secret")
2. Compare: computedSignature === sig

اعتبارات أمنية: يجب أن يكون المفتاح السري سريًا، ويتم تدويره بشكل دوري، ويحتوي على 256 بت على الأقل من الإنتروبيا. HS256 ليس مثاليًا لبنى الخدمات المصغرة حيث تحتاج العديد من الخدمات إلى المفتاح السري المشترك.

RS256 (RSA-SHA256)

RS256 غير متماثلة. يقوم المُصدر بالتوقيع باستخدام مفتاح خاص؛ ويتحقق المدققون باستخدام المفتاح العام المقابل.

signature = RSASHA256(
  base64urlEncode(header) + "." + base64urlEncode(payload),
  privateKey
)

للتحقق، استخدم المفتاح العام:

Token:   header.payload.sig
Public:  "-----BEGIN PUBLIC KEY-----..."

1. Load the RSA public key
2. Verify: RSA_SHA256_verify("header.payload", sig, publicKey)

المزايا: مفاتيح التوقيع والتحقق منفصلة. يمكن لأي خدمة التحقق دون الاحتفاظ بسر. يمكن تقديم المفاتيح العامة من نقطة نهاية JWKS لسهولة التدوير.

ES256 (ECDSA-SHA256)

تستخدم ES256 خوارزمية ECDSA مع منحنى P-256. مثل RS256، هي غير متماثلة.

signature = ECDSA_SHA256(
  base64urlEncode(header) + "." + base64urlEncode(payload),
  privateKey
)

يستخدم التحقق المفتاح العام ECDSA P-256. تنتج ES256 تواقيع أصغر بكثير (64 بايت مقابل 256 بايت لـ RSA-2048) وتوفر تحققًا أسرع.

مقارنة الخوارزميات

| الخاصية | HS256 | RS256 | ES256 | |----------|-------|-------|-------| | نوع المفتاح | متماثل (مفتاح سري مشترك) | غير متماثل (زوج RSA) | غير متماثل (زوج EC) | | حجم التوقيع | 32 بايت | 256 بايت | 64 بايت | | توزيع المفتاح | مشترك بشكل سري | المفتاح العام عام | المفتاح العام عام | | التدوير | متوسط | سهل (JWKS) | سهل (JWKS) | | حالة الاستخدام | أنظمة داخلية موثوقة | APIs موزعة | الجوال، إنترنت الأشياء |

أخطاء التحقق الشائعة

  • هجوم الخلط بين الخوارزميات. إذا كان كودك يقرأ alg من الرمز دون فرض، يمكن للمهاجم تغيير الخوارزمية. تحقق دائمًا من أن الخوارزمية تطابق القيمة المتوقعة.
  • قبول alg: "none". بعض المكتبات تقبل الرموز غير الموقعة. ارفض alg: "none" بشكل صريح.
  • اقتطاع التوقيع. المقارنة غير ثابتة الوقت يمكن أن تسرب المعلومات عبر هجمات التوقيت. استخدم المقارنة المضمنة في مكتبة JWT الخاصة بك.

التحقق من رموز JWT عبر الإنترنت

استخدم أداة فك تشفير JWT لفك تشفير والتحقق من أي رمز. الصق الرمز، واعرض header و payload، وتحقق من التوقيع من خلال توفير المفتاح السري أو المفتاح العام المناسب. تتم جميع المعالجات في متصفحك.

كيفية التحقق من تواقيع JWT: HS256 و RS256 و ES256 - CoolTool