Logo Logo
GitHub Designed by Logto

ما هو توقيع الويب JSON (JWS)؟

توقيع الويب JSON (JWS) يحدد طريقة قياسية لتوقيع والتحقق من البيانات في صيغة JSON. يُستخدم على نطاق واسع في التطبيقات الحديثة والمعايير المفتوحة مثل OpenID Connect (OIDC) لضمان سلامة وأصالة البيانات المرسلة.

JWS مفيد بشكل خاص عند العمل مع رموز الويب JSON (JWTs) . على سبيل المثال، يمكن توقيع رمز الهوية (ID token) أو رمز الوصول (Access token) باستخدام JWS والتحقق منه من قبل المستلم دون إجراء طلب عبر الشبكة مرة أخرى.

كيف يعمل JWS؟

يستخدم JWS الخوارزميات التشفيرية لتوقيع البيانات وإنتاج توقيع. هناك مفهومان رئيسيان في JWS: رأس JWS وتسلسل JWS.

رأس JWS

لدى JWS رأس يحتوي على بيانات وصفية مهمة حول خوارزمية التوقيع وإدارة المفاتيح. تتضمن بعض السمات الشائعة في رأس JWS:

  • alg (Algorithm): الخوارزمية التشفيرية المستخدمة لتوقيع البيانات.
  • typ (Type): نوع الرمز المميز، مثل JWT.
  • kid (Key ID): معرف فريد للمفتاح المستخدم في توقيع البيانات.
  • jku (JWK Set URL): الرابط الذي يتواجد فيه مجموعة مفاتيح شبكية جاسونية (JWKS) .

لقائمة مفصلة بسمات رأس JWS، ارجع إلى JOSE Header .

تسلسل JWS

لدى JWS تنسيقان للتسلسل: مضغوط وJSON. كل تنسيق له طريقته الخاصة في تمثيل البيانات الموقع عليها.

التسلسل المضغوط

في التسلسل المضغوط، يتم تمثيل JWS كسلسلة تحتوي على ثلاثة أجزاء مرمزة بـBase64URL مفصولة بالنقاط (.). الأجزاء الثلاثة هي:

{{header}}.{{payload}}.{{signature}}

لكل جزء غرض محدد:

  • header: بيانات وصفية حول خوارزمية التوقيع وإدارة المفاتيح بصيغة Base64URL.
  • payload: البيانات الموقع عليها بصيغة Base64URL.
  • signature: التوقيع التشفيري للرأس والبيان.

[!Note] لا يوجد رأس غير محمي مشمول في التسلسل المضغوط.

على سبيل المثال، قد يبدو JWS كما يلي:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkFsaWNlIn0.Xv9da66g3y4nxs_0hlR9CBkOG9GkxfPmq1_7u4tNeXE

بعد فك ترميز الأجزاء المرمزة بـBase64URL، يتكون JWS مما يلي:

  • Header: {"alg":"HS256","typ":"JWT"}
  • Payload: {"sub":"1234567890","name":"Alice"}
  • Signature: Xv9da66g3y4nxs_0hlR9CBkOG9GkxfPmq1_7u4tNeXE

الرأس يحدد أن JWS موقعة باستخدام خوارزمية HMAC-SHA256 (HS256) ونوع الرمز هو JWT (typ: "JWT") بصيغة JSON. البيان يحتوي على معلومات أساسية حول المستخدم، مثل الموضوع (sub) والاسم (name).

يتم حساب التوقيع بواسطة:

Hash(
  Base64URLEncode(header) || '.' || Base64URLEncode(payload),
  secret
)

وفقًا للرأس JWS، يتم استخدام خوارزمية HMAC-SHA256 في دالة Hash، حيث secret هو المفتاح السري المشترك top-secret في هذه الحالة.

لمثال مفصل عن كيفية عمل JWS مع JWT، ارجع إلى مقال مفتاح التوقيع (Signing key) .

تسلسل JSON

يوفر تسلسل JSON طريقة أكثر تنظيمًا لتمثيل JWS. يتم تمثيل JWS ككائن JSON يحتوي على الخصائص التالية:

{
  "payload": "{{payload}}",
  "signatures": [
    {
      "protected": "{{protected-header}}",
      "header": "{{header}}",
      "signature": "{{signature}}"
    }
  ]
}
  • payload: البيان المرمز بـBase64URL. هذه هي البيانات الموقعة.

  • signatures: مصفوفة من كائنات التوقيع، يحتوي كل منها على الرأس المحمي، الرأس، والتوقيع.

    قد يتضمن كل كائن توقيع:

    • protected: الرأس المرمز بـBase64URL المحمي (header في التسلسل المضغوط).
    • header: الرأس غير المحمي بصيغة JSON. لا يتم تضمين الرأس في التوقيع.
    • signature: التوقيع التشفيري للرأس والبيان (signature في التسلسل المضغوط).

على سبيل المثال، قد يبدو JWS في تسلسل JSON كما يلي:

{
  "payload": "eyJzdWIiOiIx...bGciOiJIUzI1NiJ9",
  "signatures": [
    {
      "protected": "eyJhbGci...InR5cCI6IkpXVCJ9",
      "header": {
        "kid": "2010-12-29"
      },
      "signature": "Xv9da66g3y4nxs...R9CBkOG9GkxfPmq1_7u4tNeXE"
    },
    {
      "protected": "eyJhbGci...InR5cCI6IkpXVCJ9",
      "header": {
        "kid": "2010-12-30"
      },
      "signature": "Yv9da66g3y4nxs...R9CBkOG9GkxfPmq1_7u4tNeXE"
    }
  ]
}

في المثال أعلاه، هناك توقيعان (signatures مصفوفة) لنفس البيان. يحتوي كل كائن توقيع على الرأس المحمي، الرأس، والتوقيع.

انظر أيضا