วิธีเพิ่มลายเซ็นความปลอดภัย PDF ใน Python
Aspose.PDF FOSS สำหรับ Python มีตัวตรวจจับการประนีประนอมลายเซ็นที่ตรวจสอบ PDF ที่ลงลายเซ็นแล้วเพื่อหารูปแบบการทำลายเฉพาะ: ไบต์ที่มีความหมายถูกต่อท้ายหลังช่วงไบต์ที่ลงลายเซ็นของลายเซ็น ซึ่งเป็นความเสี่ยงที่เฉพาะเจาะจงต่อไฟล์ PDF ที่อัปเดตอย่างต่อเนื่อง คู่มือนี้เพิ่มการตรวจสอบนั้นเข้าไปในกระบวนการทำงานของ Python โดยใช้คลาส SignaturesCompromiseDetector และ CompromiseCheckResult การสร้างหรือการนำลายเซ็นดิจิทัลใหม่ไปใช้เป็นส่วนแยกของไลบรารีและไม่ได้ครอบคลุมในที่นี้ ไลบรารีจะถูกติดตั้งด้วยคำสั่งด้านล่าง.
คู่มือขั้นตอนต่อขั้นตอน
ขั้นตอนที่ 1: ติดตั้งแพ็กเกจ
ติดตั้งแพ็กเกจ Aspose.PDF FOSS:
git clone https://github.com/aspose-pdf-foss/Aspose-PDF-FOSS-for-Python.git
cd Aspose-PDF-FOSS-for-Python
pip install -e .ตรวจสอบการติดตั้งโดยการนำเข้า SignaturesCompromiseDetector และพิมพ์ข้อความยืนยัน:
from aspose_pdf import SignaturesCompromiseDetector
print("aspose-pdf-foss-for-python is ready.")ขั้นตอนที่ 2: นำเข้าคลาสที่จำเป็น
from aspose_pdf import CompromiseCheckResult, SignaturesCompromiseDetectorขั้นตอนที่ 3: เตรียมออบเจกต์ที่เปิดเผยรายการลายเซ็น
SignaturesCompromiseDetector ไม่ได้ทำการแยกวิเคราะห์ PDF ด้วยตนเอง — ตัวสร้างของมันรับออบเจกต์ใดก็ได้ที่เปิดเผยแอตทริบิวต์ signatures: รายการของรายการลายเซ็น, แต่ละรายการบรรจุ valid, byte_range, และ reference_data. PdfSignature — คลาสธรรมดาที่สามารถสร้างได้โดยตรง — มีรูปแบบตรงกัน, ดังนั้นจึงเป็นประโยชน์สำหรับการดูว่าการตรวจสอบทำงานอย่างไรก่อนจะเชื่อมต่อกับออบเจกต์เอกสารของคุณ:
from types import SimpleNamespace
from aspose_pdf import PdfSignature
with open("signed.pdf", "rb") as handle:
pdf_bytes = handle.read()
signature = PdfSignature(
name="Signature1",
contents=b"...", # PKCS#7 signed-data blob from the signature dictionary
byte_range=[0, 1024, 1040, len(pdf_bytes) - 1040],
reference_data=pdf_bytes,
)
signed_document = SimpleNamespace(signatures=[signature])เปลี่ยน signed_document เป็นออบเจกต์เอกสารของคุณเองเมื่อมันเปิดเผยรายการ signatures ในรูปแบบเดียวกัน — ออบเจกต์ใดก็ได้ที่มีแอตทริบิวต์นั้นก็ใช้ได้.
ขั้นตอนที่ 4: ดำเนินการตรวจสอบการประนีประนอม
from aspose_pdf import SignaturesCompromiseDetector
detector = SignaturesCompromiseDetector(signed_document)
result = detector.check()
print(result.compromised) # bool
print(result.has_compromised_signatures) # bool -- same value as compromised
print(result.signatures_coverage) # int -- number of signatures inspected
print(result.reasons) # list[str] -- human-readable findingscheck() ตรวจสอบลายเซ็นทุกรายการใน signed_document.signatures, มองหาเนื้อหาที่ไม่ได้เซ็นกำกับที่ถูกต่อท้ายหลังช่วงไบต์ที่ลายเซ็นได้เซ็นไว้แต่ละอัน. CompromiseCheckResult สรุปผลลัพธ์: compromised และ has_compromised_signatures รายงานค่า boolean เดียวกันภายใต้สองชื่อ, signatures_coverage รายงานจำนวนลายเซ็นที่ถูกตรวจสอบ, และ reasons แสดงคำอธิบายที่อ่านได้โดยมนุษย์สำหรับแต่ละปัญหาที่พบ.
ขั้นตอนที่ 5: จัดการเอกสารที่ไม่มีลายเซ็น
รายการ signatures ที่ว่างหรือหายไปไม่ถือเป็นเงื่อนไขข้อผิดพลาด — จะถูกรายงานในรูปแบบเดียวกับเอกสารที่ไม่มีอะไรให้ตรวจสอบ:
from types import SimpleNamespace
from aspose_pdf import SignaturesCompromiseDetector
unsigned_document = SimpleNamespace(signatures=[])
detector = SignaturesCompromiseDetector(unsigned_document)
result = detector.check()
print(result.compromised) # False
print(result.reasons) # ["unsigned document"]การส่ง SignaturesCompromiseDetector(None) — ค่าเริ่มต้นของคอนสตรัคเตอร์ — ทำงานในลักษณะเดียวกัน.
ปัญหาทั่วไปและวิธีแก้ไข
compromised is False สำหรับ PDF ที่คุณรู้ว่าได้ถูกแก้ไขหลังจากการลงนาม
SignaturesCompromiseDetector มองหาไบต์ที่ไม่ได้เซ็นโดยเฉพาะที่ถูกเพิ่มต่อหลังช่วงไบต์ที่เซ็นของลายเซ็น — รูปแบบที่เป็นลักษณะของการปลอมแปลงแบบอัปเดตเพิ่มอย่างง่ายๆ. มันไม่ทำการตรวจสอบลายเซ็นแบบคริปโตกราฟีเต็มรูปแบบ. สำหรับกรณีนั้น, เรียก validate() บนวัตถุ PdfSignature แต่ละตัว.
compromised and has_compromised_signatures ดูเหมือนซ้ำซ้อน
พวกมันมีค่าเดียวกัน: compromised เป็นคุณสมบัติที่คำนวณได้ซึ่งคืนค่า has_compromised_signatures. ใช้ชื่อใดก็ได้ที่อ่านง่ายกว่าในโค้ดของคุณ.
ไม่มีข้อยกเว้นถูกโยนขึ้นเมื่อเอกสารไม่มี signatures แอตทริบิวต์เลย
SignaturesCompromiseDetector ปฏิบัติกับเอกสารที่ไม่มีแอตทริบิวต์ signatures หรือ document=None เหมือนกับเอกสารที่ไม่ได้ลงลายเซ็น — check() ส่งคืนผลลัพธ์ที่มี has_compromised_signatures=False และ reasons=["unsigned document"] แทนที่จะเกิดข้อผิดพลาด.
ที่ผิดรูปแบบ PdfSignature ไม่ได้รับการทำเครื่องหมาย
check() ข้ามลายเซ็นใด ๆ ที่ byte_range ไม่ใช่รายการที่มี 4 สมาชิก หรือที่ reference_data ไม่ใช่ bytes/bytearray แทนที่จะเกิดข้อผิดพลาดหรือรายงานว่าเป็นการถูกทำให้เสียหาย ลายเซ็นที่สร้างด้วยรูปแบบที่ผิดจะถูกตัดออกจากการตรวจสอบอย่างเงียบ ๆ ไม่ได้ทำเครื่องหมาย.
สับสนตัวตรวจจับนี้กับการสร้างลายเซ็น
SignaturesCompromiseDetector และ CompromiseCheckResult ตรวจสอบลายเซ็นที่มีอยู่แล้วในเอกสารเท่านั้น — พวกมันไม่มีวิธีการใด ๆ ในการสร้าง, ใช้, หรือฝังลายเซ็นใหม่.
คำถามที่พบบ่อย
สิ่งใดที่ถือว่า “เสียหาย” ที่นี่โดยตรง?
ไบต์ที่มีความหมายและไม่ใช่ช่องว่างที่เพิ่มต่อท้ายไฟล์ PDF หลังช่วงไบต์ที่ลายเซ็นได้ลงนาม — โดยมีสองข้อยกเว้นที่ตัวตรวจจับได้พิจารณาไว้แล้ว: ลายเซ็นหรือเครื่องหมายเวลาในภายหลังที่ครอบคลุมไบต์เหล่านั้นเอง, และการอัปเดตแบบเพิ่มส่วนที่เพียงเพิ่มวัสดุการตรวจสอบ (เช่น /DSS) โดยไม่เพิ่มเนื้อหาใหม่เช่นคำอธิบายประกอบ.
การตรวจสอบนี้ยืนยันความถูกต้องเชิงคริปโตของลายเซ็นเองหรือไม่?
ไม่. SignaturesCompromiseDetector ตรวจสอบรูปแบบการปลอมแปลงรอบช่วงไบต์ที่ลงลายเซ็น. ความถูกต้องเชิงคริปโตเป็นการตรวจสอบแยกต่างหาก, สามารถทำได้ผ่าน PdfSignature.validate().
signatures_coverage บอกฉันว่าอะไร?
จำนวนลายเซ็นที่การตรวจสอบได้ตรวจสอบจริงบนเอกสารที่ส่งเข้า — มีประโยชน์สำหรับยืนยันว่าตรวจจับได้เห็นลายเซ็นที่คุณคาดหวังก่อนที่จะเชื่อมั่นในผลลัพธ์ที่สะอาด.
ฉันสามารถตรวจสอบเอกสารที่มีหลายลายเซ็นพร้อมกันได้หรือไม่?
ใช่. check() วนรอบทุกรายการใน signed_document.signatures และคืนค่า CompromiseCheckResult รวมหนึ่งรายการที่ครอบคลุมทั้งหมด.
ฉันจำเป็นต้องสร้างอ็อบเจ็กต์ PdfSignature ด้วยตนเองในการใช้งานปกติหรือไม่?
ไม่ — การสร้าง PdfSignature ของขั้นตอนที่ 3 มีไว้เพื่อสำรวจพฤติกรรมของตัวตรวจจับโดยตรง. ในกระบวนการทำงานจริง, ส่งผ่านอ็อบเจ็กต์ใดก็ได้ที่โค้ดการโหลดเอกสารของคุณสร้างขึ้นแล้ว, ตราบใดที่มันเปิดเผยรายการ signatures ของรายการที่มีรูปแบบ PdfSignature.