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

الطوابع الزمنية والوقت الموثوق به

Spec: RFC 3161Spec: RFC 5816Spec: ISO 32000-2, §12.8.5

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

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

  • وقت التوقيع الذي يقرّره الموقِّع نفسه هو ادّعاء، وليس دليلًا. ومن السهل تزويره.
  • الطابع الزمني المتوافق مع RFC 3161 هو رمز موقَّع صادر عن سلطة طوابع زمنية (TSA) يربط تجزئة بياناتك بـوقت الـTSA.
  • وما يثبته دقيق: أنّ البيانات كانت موجودة قبل الوقت المعلَن من الـ⁨TSA⁩. لا لحظة الإنشاء بالضبط — بل حدٌّ أعلى.
  • يعيد الرمز صدى العدد المستخدَم مرة واحدة (⁨nonce⁩) وبصمة الرسالة (⁨message imprint⁩) الخاصّين بك، فلا يمكن أن يكون إعادة تشغيل، ولا أن يتعلّق ببيانات مختلفة.
  • يطبّق الطابع الزمني للمستند الآليّة نفسها على ملف ⁨PDF⁩ بأكمله، فيرسّخ كل ما يسبقه — التوقيع وأدلّة التحقّق المضمَّنة فيه — في لحظة موثوقة.

يتعامل ⁨NextPDF⁩ مع الطابع الزمني بوصفه شيئًا يجب التحقّق منه، لا مجرّد شيء تحصل عليه. فطلب الرمز هو الجزء الأصغر من العمل. وموقف المحرّك واضح: الرمز غير المتحقَّق منه ليس دليلًا.

عندما يضع المحرّك طابعًا زمنيًا على توقيع، يرسل إلى الـ⁨TSA⁩ تجزئة للبيانات وعددًا عشوائيًا جديدًا يُستخدَم مرة واحدة (⁨nonce⁩)، ولا يرسل البيانات نفسها أبدًا. ثم يُفحَص الرمز المُعاد وفق المجموعة الكاملة من الخصائص التي تجعله ذا معنى: أن تكون حالة السلطة “⁨granted⁩”، وأن يطابق الـ ⁨nonce⁩ في الرمز القيمة التي أُرسلت، وأن تطابق بصمة الرسالة في الرمز التجزئة المُرسلة، وأن يجتاز التوقيع التشفيري للرمز نفسه التحقّق، وأن يكون نوع محتوى الرمز هو نوع الطابع الزمني، وأن يقع الوقت المعلَن ضمن حدّ تسامح مقبول. وأيّ تباين يعني إخفاقًا صارمًا مع سبب مصنَّف. ولا يوجد مسار من نوع “يبدو قريبًا بما يكفي”. ويتّبع الطابع الزمني للمستند القاعدة نفسها، لكن على الملف بأكمله بدلًا من قيمة توقيع واحد.

الجانبان متماثلان عن قصد. فعندما يضع المحرّك طابعًا زمنيًا على توقيع، تكون البصمة التي يرسلها إلى الـ⁨TSA⁩ هي تجزئة قيمة توقيع الموقِّع؛ وعندما يتحقّق لاحقًا من ذلك الطابع الزمني، يعيد حساب التجزئة نفسها ويشترط أن تطابقها بصمة الرمز. ويُتيح ⁨NextPDF⁩ نصف التحقّق بوصفه خطوة مخصّصة ⁨verifySignatureTimestamp⁩ تأخذ قيمة التوقيع مدخلًا إلزاميًا — بحيث لا يمكن أبدًا “التحقّق” من طابع زمني لتوقيع دون فحص ما يغطّيه فعليًا. وتُخفق هذه الخطوة إخفاقًا مغلقًا عند مدخل فارغ، أو خوارزمية بصمة غير معروفة أو ضعيفة (⁨SHA-1⁩)، أو بصمة مشوَّهة، أو تجزئة لا تربط قيمة التوقيع. ولذلك فإنّ الرمز الذي أنتجته نسخة من المحرّك جزّأت مدخلًا مختلفًا لا يمكنه إثبات الربط، بحكم التصميم.

  1. Hash the dataOnly a digest of the signature value (or the whole PDF, for a document timestamp) is computed — never the data itself.
  2. Send hash + nonceThe digest and a fresh random nonce go to the Time-Stamp Authority.
  3. TSA returns a tokenA signed token binds the digest to the TSA’s genTime and echoes the nonce.
  4. Verify the tokenStatus granted, nonce matches, message imprint matches, token signature verifies, time within tolerance.
  5. Conclude an upper boundThe data provably existed before the TSA’s stated time — attested by a party that is not the signer.
كيف يُحصَل على طابع زمني موثوق وما الذي يثبته: تُرسَل تجزئة مع nonce إلى الـTSA، ويعيد الـTSA رمزًا موقَّعًا يربط تلك التجزئة بوقته، ويؤكّد المتحقِّق هذا الربط قبل اعتباره دليلًا على أنّ البيانات كانت موجودة قبل ذلك الوقت.

لا تركّب رمز طابع زمني يدويًا. فما يهمّ هو موضع الثقة. فالـ⁨TSA⁩ مكوّن تهيّئه وتحميه، لأنّ وقته يصبح دليلك.

<?php
declare(strict_types=1);
use NextPDF\Security\Signature\SignatureLevel;
// Asking for any level at or above B-T requires a TSA.
$level = SignatureLevel::PAdES_B_T;
$level->requiresTimestamp(); // true → a Time-Stamp Authority must be supplied
// The TSA endpoint, its transport security, and its trust anchor are
// deployment-supplied. The engine sends a hash plus a fresh nonce — never the
// document — and verifies the returned token before the signature is accepted.
// A token that fails any check (status, nonce, imprint, signature, time)
// is a hard error, not a warning.

والنقطة المهمة هي أنّ المحرّك يرسل تجزئة، لا المستند، فلا يرى الـ⁨TSA⁩ محتواك أبدًا. ثم يتحقّق من الاستجابة. والـ⁨TSA⁩ الذي لا يمكنك المصادقة عليه ليس وقتًا موثوقًا به. إنه مجرّد ساعة أخرى.

الفخّ هو قراءة الطابع الزمني على أنه “وُقّع هذا تمامًا عند الساعة 14:32 في هذا التاريخ.” فهو ليس ساعة إيقاف لواقعة التوقيع. بل يثبت أنّ البيانات كانت موجودة في موعد لا يتجاوز وقت الـ⁨TSA⁩، وهو حدٌّ أعلى يحدّده طرف ثالث. وقد يكون الإنشاء قد حدث في أيّ وقت قبل ذلك. والفخّ الثاني هو افتراض أنّ أيّ خادم طوابع زمنية يمنحك وقتًا موثوقًا به. فالرمز الذي لا يمكنك التحقّق من توقيعه، أو الذي لا تثق بسلطته، لا يثبت شيئًا. إنه ساعة ليس لديك سبب لتصديقها. يأتي الوقت الموثوق به من ⁨TSA⁩ يمكنك المصادقة عليه ورمز تحقّقت منه، لا من مجرّد طلب رقم من خادم.

يبني ⁨NextPDF⁩ الطلب، ويرسل تجزئة فقط، ويتحقّق من الرمز المُعاد. لكنه لا يضمن السلطة التي تقف وراءه. إنّ دقّة الـ⁨TSA⁩، وصلاحية شهادته نفسها، وجدارته بالثقة، هي خصائص للخدمة ولتهيئة عملية النشر لديك، لا للمحرّك. يربط الطابع الزمني تجزئة بـوقت. ولا يقول شيئًا عن معنى البيانات، أو هوية الموقِّع، أو ما إذا كانت شهادة الموقِّع صالحة. تلك عمليات تحقّق منفصلة يتناولها التحقّق من التوقيع بشكل صحيح. ولا يستطيع المحرّك أن يجعل ⁨TSA⁩ غير جدير بالثقة جديرًا بها. كما لا تؤكّد هذه الصفحة أيّ وزن قانوني محدّد للطابع الزمني؛ فذلك يتوقّف على حالة الـ⁨TSA⁩ والولاية القضائية. أمّا كيفية إعادة استخدام الوقت الموثوق به لإبقاء توقيعٍ قابلٍ للتحقّق على مدى عقود، فيتناولها التحقّق طويل الأمد.

يتوافر نمط الطوابع الزمنية حسب الفئة:

RFC 3161 timestamping (signature timestamp and document timestamp) — edition availability
EditionAvailability
CoreNot in this edition
Pro

PAdES B-T — طابع زمني RFC 3161 متحقَّق منه على قيمة التوقيع، من ⁨TSA⁩ يوفّره النشر لديك.

Enterprise

يضيف الطابع الزمني للمستند المستخدَم في B-LT وB-LTA لترسيخ أدلّة التحقّق المضمَّنة ولتشغيل حلقة التجديد الأرشيفي.

  • الطابع الزمني (RFC 3161) — رمز موقَّع صادر عن TSA يربط تجزئة للبيانات بوقت الـTSA، ويثبت أنّ البيانات كانت موجودة قبل ذلك الوقت.
  • سلطة الطوابع الزمنية (⁨TSA⁩) — الخدمة الموثوقة التي تُصدِر رموز الطوابع الزمنية.
  • TSTInfo — بنية محتوى الرمز: بصمة الرسالة، ووقت التوليد، والرقم التسلسلي، و nonce اختياريًا.
  • بصمة الرسالة (⁨message imprint⁩) — تجزئة البيانات التي يُوضَع عليها الطابع الزمني، ويُعاد صداها في الرمز.
  • العدد المستخدَم مرة واحدة (⁨Nonce⁩) — قيمة عشوائية جديدة تُرسَل مع الطلب ويُعاد صداها في الرمز، فلا يمكن أن تكون الاستجابة إعادة تشغيل.
  • الطابع الزمني للمستند — طابع زمني RFC 3161 على ملف ⁨PDF⁩ بأكمله (بصيغته المحدَّثة بموجب RFC 5816)، يرسّخ التوقيع وأدلّته في لحظة موثوقة.