تخطَّ إلى المحتوى
getnextpdf.com

كيف يُثبِت التوقيع الرقميّ مَن وقّع

Spec: RFC 5652Spec: RFC 5280, §6Spec: RFC 3161, §1

يفعل التوقيع الرقميّ ثلاثة أشياء، ويجدر إبقاؤها متمايزة منذ البداية: يُثبِت أنّ البايتات لم تتغيّر، ويُثبِت مَن وقّعها، و— بقليل من المساعدة — يُثبِت متى. تبني هذه الصفحة تلك الفكرة من العدم، فيكفّ علم التعمية عن كونه صندوقًا أسود.

“مُوقَّع” كلمة يبني الناس عليها قرارات. عقد، أو فاتورة، أو ملاحظة إصدار لبرنامج سيُشغّله أحدهم. وإن كنتَ تعرف فقط أنّ أداةً طبعت علامة اختيار خضراء، فأنت لا تعرف فعلًا ما الذي أُثبِت. قد يكون لديك دليل على سلامة البايتات لكن لا فكرة عن أيّ مفتاح وقّعها. وقد يكون لديك مُوقِّع حقيقيّ لكن شهادة انتهت قبل سنوات. وفهم الأجزاء هو ما يتيح لك أن تقول، بدقّة، ما الذي يعنيه توقيع صالح — وبالقدر نفسه من الفائدة، ما الذي لا يعنيه.

تخيّل ظرفًا ظاهر العبث بخاتم شخصيّ مضغوط في طيّته.

  • الخاتم فريد لشخص واحد ويستحيل تزويره فعليًّا. يستطيع أيّ أحد التعرّف عليه؛ ولا يستطيع صنعه إلّا مالكه. ذلك هو زوج المفاتيح: مفتاح خاصّ تملكه وحدك، ومفتاح عامّ يستطيع الجميع رؤيته.
  • أنت لا تضغط الخاتم فوق المستند كلّه. تضغطه فوق ملخّص صغير غير قابل للتزوير له — التجزئة. غيّر بايتةً واحدة من المستند فيتغيّر الملخّص كليًّا، فلا يعود الخاتم يلائم.
  • التوقيع هو إنتاج توقيع على المستند بمفتاحك الخاصّ — على التجزئة لـ⁨RSA⁩ و⁨ECDSA⁩، أو على المحتوى نفسه لـ⁨EdDSA⁩، الذي يُجري تجزئته الخاصّة داخليًّا. والتحقّق هو إجراء فحص الخوارزمية بمفتاحك العامّ، والتوقيع، والمحتوى نفسه (تجزئةً، أو مباشرةً) — ويعيد صالحًا أو غير صالح. الرياضيات، لا الثقة، تربط الاثنين.
  • الشهادة هي الجزء الذي يقول لمَن هذا الخاتم. دونها، تكون قد أثبتَّ أنّ مفتاحًا وقّع البايتات، لا أنّ المفتاح يخصّ أحدًا بعينه.
  • الطابع الزمنيّ هو الجزء الذي يقول متى. ساعة المُوقِّع نفسه مجرّد ادّعاء؛ والوقت الموثوق يأتي من سلطة خارجية.

ابدأ بالتجزئة، لأنّ كلّ شيء آخر يقوم عليها. تقرأ دالّة تجزئة تعموية أيّ كمّ من البيانات وتُنتج بصمةً قصيرة ثابتة الطول — لتوقيع ⁨PDF⁩، عادةً قيمة بطول ⁨256⁩ بت. وخاصّيتان تجعلانها مفيدة: المُدخل نفسه يُنتِج البصمة نفسها دائمًا، ويتعذّر إيجاد مُدخل مختلف بالبصمة نفسها. فالتجزئة بديل أمين عن المستند. وإن تطابقت تجزئتان، تطابقت البايتات.

والآن زوج المفاتيح. المفتاح الخاصّ والمفتاح العامّ مرتبطان رياضيًّا، لكن لا يمكنك اشتقاق أحدهما من الآخر في أيّ قدر عمليّ من الوقت. ولا يستطيع إنتاج توقيع صالح إلّا المفتاح الخاصّ، ولا يستطيع فحصه إلّا المفتاح العامّ المطابق. يستخدم التوقيع ذلك اللاتماثل: يُطبّق المُوقِّع عملية مفتاح خاصّ على المُدخل الذي تُعرِّفه الخوارزمية المختارة — تجزئة المحتوى لـ⁨RSA⁩ و⁨ECDSA⁩، أو المحتوى مباشرةً لـ⁨EdDSA⁩، الذي يُجزِّئ داخليًّا. والنتيجة هي قيمة التوقيع. ولأنّ حامل المفتاح الخاصّ وحده كان بإمكانه إنتاجها، ولأنّها مربوطة بـهذا المحتوى، فهي تُثبِت أمرين دفعةً واحدة — أنّ الحامل وقّع، وأنّ البايتات لم تتحرّك منذئذٍ.

يعكس التحقّق ذلك المنطق. يعيد المُحقِّق بناء المُدخل نفسه — بتجزئة المستند لـ⁨RSA⁩ و⁨ECDSA⁩، أو بأخذ المحتوى مباشرةً لـ⁨EdDSA⁩ — ثمّ يُجري عملية التحقّق لخوارزمية التوقيع على المفتاح العامّ، وقيمة التوقيع، وذلك المُدخل. وتعيد العملية صالحًا أو غير صالح — وهذا الشكل نفسه سواء كانت الخوارزمية ⁨RSA⁩ أو ⁨ECDSA⁩ أو ⁨EdDSA⁩، وإن كان ⁨RSA⁩ وحده يمكن تصويره وكأنّه “يستعيد” التجزئة حرفيًّا. الصالح يعني سليمًا وأصيلًا. وغير الصالح يعني أنّ شيئًا تغيّر، أو أنّ المفتاح الخاطئ استُخدم، والجواب الصادق هو غير صالح.

  1. هيّئ المُدخليُجزِّئ RSA وECDSA المستند إلى بصمة قصيرة ثابتة الطول؛ ويُوقِّع EdDSA المحتوى مباشرةً ويُجزِّئه داخليًّا. وفي كلتا الحالتين، أيّ تغيير في البايتات يغيّر ما يُوقَّع.
  2. وقِّع بالمفتاح الخاصّيُطبّق المُوقِّع عملية مفتاح خاصّ على ذلك المُدخل — التجزئة لـ RSA وECDSA، والمحتوى لـ EdDSA. والمُخرَج هو قيمة التوقيع؛ ولا أحد سوى حامل المفتاح الخاصّ كان بإمكانه إنتاجها.
  3. أعِد بناء المُدخليعيد المُحقِّق بناء المُدخل نفسه من المحتوى مستقلًّا — تجزئة مُعاد حسابها لـ RSA وECDSA، والمحتوى نفسه لـ EdDSA. وهذا ما تفحصه عملية التحقّق إزاءه.
  4. تحقّق بالمفتاح العامّيُجري المُحقِّق عملية التحقّق للخوارزمية على المفتاح العامّ، وقيمة التوقيع، وذلك المُدخل. والشكل نفسه يعمل لـ RSA وECDSA وEdDSA.
  5. اقبل أو ارفضتعيد عملية التحقّق صالحًا أو غير صالح. الصالح يعني أنّ البايتات سليمة وأنّ حامل المفتاح الخاصّ وقّعها. وإلّا فالنتيجة غير صالح — بلا تخمين.
How a digital signature is produced and then checked, from first principles. The signer produces a signature over the content with their private key — over a hash for RSA and ECDSA, or over the content directly for EdDSA; the verifier reconstructs the same input, then runs the algorithm's verify operation on the public key, the signature, and that input. A valid result proves the bytes are intact and that the private-key holder signed them.

في ملفّ ⁨PDF⁩ حقيقيّ، لا يضغط ⁨NextPDF⁩ الخاتم فوق الصفحة المرئية — بل يضغطه فوق مدًى مُعلَن من البايتات، ويحزم التوقيع بوصفه كائن ⁨CMS⁩ منفصلًا (Spec: RFC 5652) موضوعًا داخل الملفّ (Spec: ISO 32000-2, §12.8). وثمّة تنقيح واحد يهمّ: لا يُوقِّع المُوقِّع تجزئة المحتوى الخامّ مباشرةً. بل يُوقِّع مجموعة صغيرة من السمات المُوقَّعة التي تتضمّن تجزئة المحتوى، فيُختَم الوقت ونوع المحتوى ومُعرِّف شهادة المُوقِّع معًا. وأين تقطن تلك البايتات، ولماذا المدى مُشكَّل على ذلك النحو، هو موضوع كيف تقطن التوقيعات في ⁨PDF⁩.

حتى الآن، تُثبِت الرياضيات أنّ مفتاحًا وقّع هذه البايتات. وهي لا تقول شيئًا عن أيّ مفتاح. وتلك الفجوة هي بالضبط ما تملؤه الشهادة. الشهادة هي ذاتها بيان مُوقَّع — من سلطة شهادات — بأنّ هذا المفتاح العامّ يخصّ هذا الموضوع المُسمّى. والوثوق بها يعني متابعة السلسلة من شهادة المُوقِّع صعودًا إلى سلطة قرّرتَ الوثوق بها، مع فحص صلاحية كلّ حلقة على الطريق (Spec: RFC 5280, §6). دون تلك السلسلة، “مُوقَّع” مجهول الهوية. ومعها، لـ”مُوقَّع” اسم.

الجزء الأخير هو متى. يستطيع التوقيع تضمين وقت المُوقِّع المُدّعى، لكنّ ساعةً لا تتحكّم فيها ادّعاء، لا دليل. يربط طابع زمنيّ من سلطة طوابع زمنية تجزئةَ التوقيع بلحظة، مُشهَدًا عليها من طرف لا مصلحة له في المستند (Spec: RFC 3161, §1). وذلك ما يتيح لتوقيع أن يبقى ذا معنى بعد انتهاء شهادة المُوقِّع: يمكنك إظهار أنّ التوقيع وُجِد بينما كانت الشهادة لا تزال صالحة. والمعالجة الأعمق في الطوابع الزمنية والوقت الموثوق.

الأشكال أدناه هي العمليات المفاهيمية، مكتوبةً بوضوح. والمغزى ليس استدعاء واجهة برمجة تطبيقات — بل رؤية أنّ التوقيع والتحقّق صورتان متعاكستان، وأنّ بايتةً مُعبَثًا بها تكسر التطابق بحكم البناء.

<?php
declare(strict_types=1);
// SIGN — the holder of the private key seals the content.
// RSA and ECDSA sign a hash; EdDSA signs the content directly (hashing inside).
$signingInput = sign_input($content); // a digest for RSA/ECDSA, the content for EdDSA
$signatureValue = private_key_transform( // only the key holder can do this
privateKey: $signerPrivateKey,
input: $signingInput,
);
// VERIFY — anyone with the public key runs the algorithm's check.
$recomputedInput = sign_input($content); // verifier rebuilds the same input
$intactAndAuthentic = signature_verify( // RSA, ECDSA, EdDSA — same shape
publicKey: $signerPublicKey, // taken from the certificate
signatureValue: $signatureValue,
input: $recomputedInput, // the freshly reconstructed input
);
// true -> bytes unchanged AND signed by the private-key holder
// false -> a byte changed, or the wrong key — the honest answer is "invalid"
// The certificate answers a SEPARATE question: whose public key is this?
// The timestamp answers ANOTHER: when did this signature exist?
// "intact + authentic" alone proves neither identity nor time.

تزوير تغيير لا يزال يتحقّق هو أمر يتعذّر حسابيًّا. تحمل التجزئة المحتوى بأمانة، فتبديل المحتوى يبدّل التجزئة، وعملية التحقّق ترفضه — ما لم يُعثَر على تصادم تجزئة، وهو ما صُمِّمت الدالّة المختارة لجعله غير عمليّ.

الخطأ المتكرّر هو قراءة “توقيع صالح” بوصفه “مستندًا جديرًا بالثقة”. وهما ليسا الجملة نفسها. يُثبِت علم التعمية أنّ البايتات سليمة وأنّ حامل المفتاح الخاصّ وقّعها — لا أكثر. فمستند مُوقَّع بمفتاح لم تسمع به قطّ، مُشهَدًا عليه من لا سلطة تعرفها، يمكن أن يكون “صالحًا” بلا عيب ولا يساوي شيئًا. الهوية تأتي من الشهادة وسلسلتها؛ والوقت يأتي من طابع زمنيّ موثوق. وعلامة اختيار خضراء تطوي كلّ هذه بهدوء في قيمة منطقية واحدة قد قرّرت، نيابةً عنك، أيّ الأسئلة كان يهمّ. ومعرفة الأجزاء هي ما يتيح لك طرح البقيّة.

تشرح هذه الصفحة فكرة التوقيع الرقميّ، لا إجراء التحقّق الكامل. الرياضيات هنا تُثبِت السلامة والأصالة. وهي لا تخبرك، بمفردها، أنّ شهادة التوقيع أُصدِرت لمَن تظنّ، ولا أنّها كانت صالحة وقت التوقيع، ولا أنّها أُبطِلت لاحقًا — فتلك أسئلة مسار الشهادة والإبطال، والتحقّق الصحيح يُجري كلّها. ومجموعة الفحوص الكاملة في التحقّق من التوقيع كما ينبغي.

يبني ⁨NextPDF⁩ بنية التوقيع ويُجري فحوص التعمية. وهو لا يختار مراسي الثقة لديك، ولا يضمن أيّ سلطة شهادات، ولا يقرّر الأثر القانونيّ لتوقيع — فتلك تعتمد على نشرك، وعلى الشهادة، وعلى الولاية القضائية. المحرّك يُثبِت الآليّة؛ وقرارات الثقة فوقها لك.

ما يَشحنه المحرّك، حسب المستوى، يُبنى نحو الخارج من هذا الأساس:

Digital signature: integrity, identity, and trusted time — edition availability
EditionAvailability
Core

PAdES B-B: the hash-and-sign mechanism described here, packaged as a detached CMS SignedData object, plus certificate-path validation against a trust anchor you supply.

Pro

Adds PAdES B-T — a verified RFC 3161 trusted timestamp on the signature value, so the “when” is attested rather than self-claimed.

Enterprise

Adds the long-term profiles (B-LT, B-LTA): embedded validation material and document timestamps that keep the identity and time proofs answerable for years.

  • التجزئة (الموجز) — بصمة قصيرة ثابتة الطول للبيانات من دالّة تجزئة تعموية؛ أيّ تغيير في البيانات يغيّرها كليًّا.
  • زوج المفاتيحمفتاح خاصّ مرتبط (يملكه المُوقِّع وحده) ومفتاح عامّ (يُشارَك بحرّية)؛ لا يستطيع التوقيع إلّا المفتاح الخاصّ، ولا يستطيع التحقّق إلّا المفتاح العامّ المطابق.
  • التوقيع — تطبيق عملية المفتاح الخاصّ على المُدخل الذي تُعرِّفه الخوارزمية: تجزئة المحتوى لـ⁨RSA⁩ و⁨ECDSA⁩، أو المحتوى مباشرةً لـ⁨EdDSA⁩ (الذي يُجزِّئ داخليًّا). وفي ⁨PDF⁩، ذلك المحتوى هو السمات المُوقَّعة، التي تتضمّن تجزئة المستند. والنتيجة قيمة التوقيع.
  • التحقّق — إعادة بناء المُدخل نفسه (تجزئة مُعاد حسابها، أو المحتوى مباشرةً لـ⁨EdDSA⁩)، ثمّ إجراء عملية التحقّق للخوارزمية على المفتاح العامّ، وقيمة التوقيع، وذلك المُدخل للحصول على جواب صالح-أو-غير-صالح.
  • قيمة التوقيع — البايتات التي تُنتجها عملية المفتاح الخاصّ؛ ما يفحصه مُحقِّق إزاء مُدخل الخوارزمية المُعاد بناؤه حديثًا (موجز لـ⁨RSA⁩ و⁨ECDSA⁩، والمحتوى نفسه لـ⁨EdDSA⁩).
  • الشهادة — بيان مُوقَّع يربط مفتاحًا عامًّا بهوية مُسمّاة؛ موثوق به بالتسلسل إلى سلطة تقبلها (RFC 5280 §6).
  • مرساة الثقة — سلطة شهادات قرّرتَ الوثوق بها؛ جذر سلسلة شهادات مقبولة.
  • الطابع الزمنيّ (RFC 3161) — رمز مُوقَّع من سلطة طوابع زمنية يربط تجزئةً بقيمة وقت، مُوفِّرًا دليلًا موثوقًا على متى.
  • CMS SignedData — بنية صياغة رسائل التعمية (RFC 5652) التي تحمل قيمة التوقيع وشهادة المُوقِّع.
  • PAdES — التوقيعات الإلكترونية المتقدّمة لـ⁨PDF⁩: عائلة ملامح ⁨ETSI⁩ لتوقيع ⁨PDF⁩. مشمولة بعمق في صفحات التوقيع.