تكتب PDFiumPas تشفير ISO/TS 32003 عبر SaveAsEncrypted: اضبط Revision على erR7 وستُحمى كل سلسلة نصية وتيار بـ AES-256 في وضع GCM، وهو الشيفرة الموثَّقة التي اكتسبها PDF 2.0 في 2023. اضبط EnableIntegrityProtection أيضاً وسيحمل المستند رمز PDF MAC مستقلاً أيضاً، والذي تفحصه ValidatePdfMac على جانب القراءة
هاتان حمايتان مختلفتان يخلط الناس بينهما بشكل روتيني. يوثّق GCM كل قيمة مشفَّرة. أما MAC فيوثّق المستند ككل. تريد كليهما، لأسباب مختلفة
ماذا يضيف GCM لم يقدمه CBC أبداً؟
توثيق النص المشفَّر. يحافظ AES-256 في وضع CBC، وهو مخطط AESV3 في ISO 32000-2، على سرية المحتوى ولا يقول شيئاً عمّا إذا كان قد وصل دون تعديل. CBC قابل للطرق بطرق محددة ومدروسة جيداً: المهاجم القادر على قلب بتات في النص المشفَّر ينتج تغييرات متوقعة في النص الصريح للكتلة التالية، ولا شيء في الصيغة يلاحظ ذلك
يغلق GCM تلك الثغرة. تحمل كل قيمة مشفَّرة علامة توثيق من 16 بايت، مُسلسَلة بالكامل كما تتطلب ISO/TS 32003، ويفشل فك التشفير بدلاً من إعادة نص صريح مُعدَّل عندما لا تتطابق العلامة. من منظور PDF، تكون سلسلة نصية أو تيار متلاعب به في مستند AESV4 خطأً صارماً عند نقطة الاستخدام، لا قيمة غريبة تنتشر إلى تطبيقك. يُميِّز قاموس Encrypt هذا بـ /CFM /AESV4 وV 6 / R 7، إلى جانب إدخال امتدادات يعلن /ExtensionLevel 32003 و/ExtensionRevision (:2023)
ثلاث مراجعات، ثلاثة أنظمة بيئية
يوفر TPdfEncryptionRevision القيم erR5 وerR6 وerR7، والاختيار قرار توافق أكثر منه قراراً تشفيرياً. R5 هو مخطط AES-256 الأصلي المنشور كامتداد لـ PDF 1.7، بتجزئة كلمة مرور SHA-256 واحدة، ويُفتح في كل شيء تقريباً من الخمسة عشر عاماً الماضية. R6 هو اشتقاق المفتاح المقسَّى الموحَّد في ISO 32000-2، باستخدام بناء SHA-256/384/512 المكرر للخوارزمية 2.B، وهو ما يتوقعه سير عمل PDF 2.0 أو PDF/A-4 الحالي. R7 هو ISO/TS 32003، باستخدام الاشتقاق 2.B نفسه مع AES-GCM كشيفرة
يسير دعم العارضين بهذا الترتيب بالضبط، ودعم R7 لا يزال ضعيفاً خارج العارضين الرئيسيين الحاليين. هذه هي المفاضلة نفسها التي تحكم أي ميزة من ميزات PDF 2.0: الخيار الأحدث هو أفضل هندسة وأضيق جمهور. قرر بناءً على من سيفتح الملف، وإذا كانت الإجابة «نظام سجلات لم يحدّثه أحد منذ 2019»، فالإجابة هي R5 بغض النظر عمّا تفضّله سياسة الأمان
uses
PDFium, FPdfEncrypt;
var
Pdf: TPdf;
Opts: TPdfEncryptOptions;
begin
Pdf := TPdf.Create(nil);
try
Pdf.FileName := 'quarterly-report.pdf';
Pdf.LoadDocument;
Opts := TPdfEncryptOptions.Default;
Opts.UserPassword := 'open-secret';
Opts.OwnerPassword := 'admin-secret';
Opts.EncryptMetadata := True;
Opts.Revision := erR7; // ISO/TS 32003 AESV4-GCM
Opts.EnableIntegrityProtection := True; // رمز PDF MAC مستقل
if not Pdf.SaveAsEncrypted('quarterly-report.enc.pdf', Opts) then
raise Exception.Create('Encrypted save failed');
finally
Pdf.Free;
end;
end;
لماذا MAC للمستند فوق شيفرة موثَّقة؟
لأن علامات GCM تحمي القيم، لا ترتيب القيم. كل سلسلة نصية وتيار في مستند AESV4 موثَّقة على حدة، لكن جدول المراجع المتقاطعة، وترقيم الكائنات، والمؤخرة بنية، لا محتوى مشفَّر. لا يستطيع المهاجم تزوير تيار، لكن لا شيء في الشيفرة وحدها يمنعه من إعادة ترتيب الكائنات التي يشير إليها المستند، أو دمج كائنات من مراجعة سابقة للملف نفسه
يعالج رمز PDF MAC المستقل تلك الطبقة. تشتقه PDFiumPas من مفتاح تشفير الملف بواسطة /KDFSalt مخصص من 32 بايت مسجَّل في قاموس Encrypt، بحيث تكون حيازة كلمة المرور هي ما يتيح للقارئ تأكيد الرمز. النتيجة إجابة واحدة على سؤال واحد: هل هذا المستند، ككل، هو المستند الذي كُتب
var
Pdf: TPdf;
Mac: TPdfMacValidationResult;
begin
Pdf := TPdf.Create(nil);
try
Pdf.Password := 'open-secret';
Pdf.FileName := 'quarterly-report.enc.pdf';
Pdf.LoadDocument;
Mac := Pdf.ValidatePdfMac('open-secret');
case Mac.Status of
pmvsValid: ProcessDocument(Pdf);
pmvsNotPresent: ProcessWithWarning(Pdf); // لا يوجد رمز في هذا الملف
pmvsInvalid: Quarantine(Mac.MessageText); // متلاعب به أو مقتطَع
pmvsUnsupported: RouteForManualReview(Mac.MessageText);
end;
finally
Pdf.Free;
end;
end;
قيم الحالة الأربع تحتاج إلى أربع استجابات مختلفة، وضغطها في قيمة منطقية واحدة يفقد التمييز المهم. تعني pmvsNotPresent أن الملف ببساطة لا يحمل رمزاً، وهذا يصف تقريباً كل ملف PDF مشفَّر كُتب قبل 2024 وليس دليلاً على شيء. تعني pmvsInvalid أن رمزاً موجود ولا يتحقق، وهذا اكتشاف حقيقي ويجب أن يوقف المعالجة. تعني pmvsUnsupported أن الرمز موجود بشكل لا تنفذه هذه النسخة، وهذه فجوة توافق، لا هجوم. معاملة «غير موجود» على أنه «غير صالح» سيحجر أرشيفك الكامل من اليوم الأول
ما الذي لا يزال التشفير عاجزاً عن فعله
تبقى علامات الأذونات كما كانت دائماً: طلب موجَّه إلى برنامج مطابق، لا وسيلة تحكم. تُحترَم بتات /P من الجدول 22 في ISO 32000-1 التي تمنع الطباعة أو الاستخراج من قِبل العارضين حسني السلوك ويتجاهلها كل شيء آخر، وأي شخص يحمل كلمة مرور المستخدم يحمل بالفعل المحتوى المفكوك التشفير. التشفير هو الحدّ؛ والأذونات تصف النية داخله
تفصيلان تشغيليان يستحقان التخطيط لهما. أولاً، يتفاعل التشفير مع التعديل اللاحق: إلحاق تحديث تزايدي بمستند مشفَّر له قواعده الخاصة، موضحة في التحديثات التزايدية على ملفات PDF المشفَّرة، ورمز MAC هو تصريح على مستوى المستند سيبطله إلحاق غير حذر. ثانياً، يستخدم بناء GCM عداد متجه تهيئة حتمياً، وتثير PDFiumPas استثناءً بدلاً من إعادة استخدام قيمة عداد إذا استُنفدت تلك المساحة يوماً، لأن إعادة استخدام nonce في GCM كارثية بطريقة سيخفيها التفاف صامت
الاختيار بين المراجعات الثلاث عملياً
دوِّن من سيفتح الملف، ثم اختر. بالنسبة للتوزيع الداخلي حيث يكون كل قارئ عارضاً حالياً تحت سيطرتك، R7 مع حماية التكامل هو الخيار الأقوى المتاح ولا يوجد سبب لعدم استخدامه. بالنسبة للمستندات التي تغادر المؤسسة، R6 هو الافتراضي القابل للدفاع عنه: فهو موحَّد في ISO 32000-2 بدلاً من مواصفة تقنية فوقه، والدعم واسع. بالنسبة للأرشيفات والمستهلكين القدامى، R5 هو الخيار الوحيد الذي يُفتح بشكل موثوق، ويجب أن تسجل السبب في المكان نفسه الذي تسجل فيه بقية سياسة الاحتفاظ لديك
أياً كان اختيارك، تحقق من المخرجات بدلاً من الوثوق بأن الاستدعاء نجح. أعد فتح الملف المشفَّر، وافحص ValidatePdfMac، وتأكد من أن الإصدار المُعلَن هو ما تتوقعه، باستخدام فحوصات مطابقة الإصدار في مطابقة إصدار PDF الدقيقة. قائمة تحقق أوسع للاستيعاب من مستندات غير موثوقة موجودة في تدقيق مخاطر أمان PDF
PDFiumPas مكون لـ Delphi وLazarus مبني حول محرك PDFium مع تنفيذ حزمة تشفير PDF 2.0 أصلياً بلغة Pascal، بحيث لا يحتاج AES-256 وGCM ورمز MAC إلى أي DLL تشفير خارجي. واجهة برمجة التشفير موثَّقة على صفحة مكون PDFium لـ Delphi