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 |