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
ความแตกต่างระหว่าง Sign และ Certify คืออะไร?
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 |