Security

Security

تغطي هذه الصفحة كلمات المرور، والتشفير، والتوقيعات الرقمية. Document.OpenFile() / Document.Open() يقبلان كلمة مرور لفتح مستند محمي، Document.Save() يقبل encrypt خيارًا لحمايته، وDocument.Sign() / Document.Certify() / Document.VerifySignatures() يضيفون ويتحققون من التوقيعات الرقمية.


فتح وفك تشفير المستندات المحمية بكلمة مرور

مرّر { password: '...' } إلى Document.OpenFile() أو Document.Open() لفتح مستند محمي بكلمة مرور مستخدم. إذا كانت كلمة المرور مفقودة أو خاطئة، فإن الاستدعاء يطرح InvalidPasswordError.

import { Document, InvalidPasswordError } from '@asposefoss/pdf';

try {
  const doc = Document.OpenFile('secret.pdf', { password: 'hunter2' });
  doc.WriteTo('decrypted.pdf');    // output is plaintext
} catch (e) {
  if (e instanceof InvalidPasswordError) console.error('wrong password');
  else throw e;
}

التشفير عند الحفظ

Document.Save() (وDocument.WriteTo()) يقبلان encrypt خيارًا. التشفير القائم على كلمة المرور هو الحالة الشائعة؛ المكتبة تدعم أيضًا التشفير بالمفتاح العام إلى شهادة أو أكثر للمتلقي، والتي تُفتح مرة أخرى باستخدام المفتاح الخاص للمتلقي.

// Encrypt to one or more recipient certificates (PEM string or DER bytes):
const bytes = doc.Save({
  encrypt: {
    recipients: [{ certificate: recipientCertPem }],
    algorithm: 'aes256',                 // 'aes256' (default) | 'aes128' | 'rc4'
    permissions: { copying: false },     // shared across all recipients
  },
});

// Open with the recipient's private key + certificate, or a PKCS#12 bundle:
const opened = Document.Open(bytes, {
  recipient: { privateKey, certificate: recipientCertPem },
});
console.log(opened.Permissions);         // recovered permission flags (not enforced)

التوقيع والتصديق

يضيف Document.Certify() توقيع شهادة (المؤلف) يحمل تحويل DocMDP يعلن عن التغييرات اللاحقة المسموح بها؛ يضيف Document.Sign() توقيع موافقة عادي إضافي يمكن إلحاقه تدريجيًا فوقه. كلاهما يأخذ مُوقّع { certificate, privateKey } وكائن خيارات (reason، location، name، fieldName، — بالنسبة إلى Certify() — permissions).

const certifying = Document.OpenFile('report.pdf');
await certifying.Certify(
  { certificate: author.certificate, privateKey: author.privateKey },
  { permissions: 'form-fill', reason: 'Certifying the report', fieldName: 'Certification' },
);
const certifiedBytes = certifying.Save();

const approving = Document.Open(certifiedBytes);
await approving.Sign(
  { certificate: approver.certificate, privateKey: approver.privateKey },
  { reason: 'Approved for publication', fieldName: 'Approval' },
);
approving.WriteTo('signed.pdf');

التحقق من التوقيعات

يفحص Document.VerifySignatures() كل توقيع في المستند: يعيد حساب كل ملخّص /ByteRange، يتحقق من CMS المنفصل، ويبلغ عما تغيّر بعد كل توقيع. يُعيد SignatureReport[]، مدخلاً واحدًا لكل توقيع.

const reports = await Document.OpenFile('signed.pdf').VerifySignatures();
for (const r of reports) {
  console.log(r.name, 'integrity:', r.integrity, 'signature:', r.signature);
}

نصائح وأفضل الممارسات

  • امسك InvalidPasswordError بشكل محدد قبل التقاط أوسع عند فتح مدخل غير موثوق، حتى تتمكن من الرد بشكل مختلف على كلمة مرور سيئة مقارنة بملف فاسد.
  • استدعِ Certify() قبل أي استدعاءات Sign() — توقيع الشهادة يحدد أذونات DocMDP التي تُبنى فوقها توقيعات الموافقة اللاحقة.
  • يعيد Document.Open() Permissions المستعاد بعد فك تشفير المفتاح العام، لكن المكتبة لا تُطبقها بنفسها — اعتبرها معلوماتية.
  • إن VerifySignatures() هو async — await إياه (أو عالج Promise المُعاد) قبل قراءة مصفوفة التقرير.

المشكلات الشائعة

المشكلةالسببالإصلاح
Document.OpenFile() / Document.Open() يثير InvalidPasswordErrorالمستند محمي بكلمة مرور ولم يتم تقديم أي كلمة مرور، أو تم تقديم كلمة مرور خاطئةمرّر { password: '...' } إلى Document.OpenFile() / Document.Open()
فشل فك تشفير المفتاح العامتم تمرير المفتاح الخاص أو الشهادة الخاطئة، أو لا يتطابق أي منهما مع أي إدخال recipients تم استخدامه في وقت التشفيرتأكد من أن خيار recipient privateKey / certificate (أو حزمة PKCS#12) يطابق أحد المستلمين الأصليين
توقيع الموافقة يبطل الشهادةتم استدعاء Sign() بأذونات لا يسمح بها تحويل DocMDP المُصدِّرعيّن قيمة permissions على Certify() (مثال: 'form-fill') واسعة بما يكفي للتغييرات التي سيجريها المُوقِّعون لاحقًا
يُبلغ VerifySignatures() عن فشل فحص النزاهةتم تعديل البايتات الموقعة بعد التوقيع، خارج التحديث التدريجي الذي تغطيه التوقيعأعد توقيع المستند بعد أي تعديلات إضافية

FAQ

ما الفرق بين التوقيع والتوثيق؟

Certify() يضيف أول توقيع توثيق ويعلن (عبر تحويل DocMDP) ما التغييرات اللاحقة المسموح بها. Sign() يضيف توقيع موافقة عادي، يُضاف تدريجيًا فوق ما سبق.

كيف يمكنني فتح ملف PDF محمي بكلمة مرور؟

مرّر { password: '...' } إلى Document.OpenFile() أو Document.Open()، وامسك InvalidPasswordError إذا كانت كلمة المرور قد تكون خاطئة.

هل تُفرض هذه المكتبة علامات أذونات PDF؟

لا. Document.Open() يستعيد علامات Permissions من مستند مُشفّر لتفحصها، لكنه لا يقيّد ما يمكن لشفرتك فعله مع المستند المفتوح.

كيف أتحقق مما إذا كانت توقيعات PDF الموقعة لا تزال صالحة؟

استدعِ Document.VerifySignatures() (طريقة async) وتفقد حقول integrity وsignature لكل SignatureReport تم إرجاعه.


API Reference ملخص

فئة/طريقةوصف
Document.OpenFile() / Document.Open()افتح مستندًا، مع إمكانية الحماية بكلمة مرور أو مفتاح عام
InvalidPasswordErrorيُرمى عندما تكون كلمة المرور مفقودة أو خاطئة
Document.Save() / Document.WriteTo()احفظ مستندًا، اختياريًا باستخدام خيار encrypt
Permissionsتم استرداد علامات الأذونات من مستند مشفر
Document.Certify()أضف توقيع شهادة (المؤلف) باستخدام تحويل DocMDP
Document.Sign()أضف توقيع موافقة
Document.VerifySignatures()تحقق من كل توقيع في المستند
SignatureReportنتيجة التحقق من توقيع واحد: name, integrity, signature

انظر أيضاً

 العربية