วิธีเพิ่มลายเซ็นความปลอดภัย PDF ใน Python

วิธีเพิ่มลายเซ็นความปลอดภัย 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 findings

check() ตรวจสอบลายเซ็นทุกรายการใน 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.

ดูเพิ่มเติม

 ภาษาไทย