Cách Thêm Chữ Ký Bảo Mật PDF trong Python

Cách Thêm Chữ Ký Bảo Mật PDF trong Python

Aspose.PDF FOSS cho Python bao gồm một bộ phát hiện phá vỡ chữ ký, nó kiểm tra PDF đã được ký để phát hiện một mẫu giả mạo cụ thể: các byte có ý nghĩa được nối thêm sau phạm vi byte đã ký của chữ ký, một rủi ro đặc thù đối với các tệp PDF được cập nhật một cách tăng dần. Hướng dẫn này bổ sung kiểm tra đó vào quy trình Python bằng cách sử dụng các lớp SignaturesCompromiseDetector và CompromiseCheckResult. Việc tạo hoặc áp dụng các chữ ký số mới là một phần riêng của thư viện và không được đề cập ở đây. Thư viện được cài đặt bằng lệnh dưới đây.

Hướng Dẫn Từng Bước

Bước 1: Cài Đặt Gói

Cài đặt gói 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 .

Xác minh việc cài đặt bằng cách nhập SignaturesCompromiseDetector và in ra thông báo xác nhận:

from aspose_pdf import SignaturesCompromiseDetector
print("aspose-pdf-foss-for-python is ready.")

Bước 2: Nhập các lớp cần thiết

from aspose_pdf import CompromiseCheckResult, SignaturesCompromiseDetector

Bước 3: Chuẩn bị một đối tượng công khai danh sách chữ ký

SignaturesCompromiseDetector không tự phân tích một tệp PDF — hàm khởi tạo của nó chấp nhận bất kỳ đối tượng nào công khai thuộc tính signatures: một danh sách các mục chữ ký, mỗi mục mang valid, byte_range, và reference_data. PdfSignature — một lớp đơn giản, có thể khởi tạo trực tiếp — phù hợp với cấu trúc đó, vì vậy nó hữu ích để xem cách kiểm tra hoạt động trước khi gắn nó vào đối tượng tài liệu của bạn:

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])

Thay thế signed_document bằng đối tượng tài liệu của bạn khi nó công khai danh sách signatures theo cùng kiểu — bất kỳ đối tượng nào có thuộc tính đó đều hoạt động.


Bước 4: Thực hiện Kiểm tra Sự xâm phạm

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() duyệt qua mỗi chữ ký trong signed_document.signatures, tìm kiếm nội dung chưa ký được nối thêm sau phạm vi byte đã ký của mỗi chữ ký. Một CompromiseCheckResult tóm tắt kết quả: compromised và has_compromised_signatures báo cáo cùng một giá trị boolean dưới hai tên, signatures_coverage báo cáo số lượng chữ ký đã được kiểm tra, và reasons liệt kê giải thích bằng ngôn ngữ dễ hiểu cho mỗi vấn đề được phát hiện.


Bước 5: Xử lý Tài liệu Không Có Chữ ký

Một danh sách signatures trống hoặc thiếu không phải là điều kiện lỗi — nó được báo cáo theo cùng cách như một tài liệu không có gì để kiểm tra:

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"]

Việc truyền SignaturesCompromiseDetector(None) — giá trị mặc định của hàm khởi tạo — hoạt động tương tự.

Các vấn đề thường gặp và cách khắc phục

compromised is False đối với một tệp PDF mà bạn biết đã được chỉnh sửa sau khi ký

SignaturesCompromiseDetector tìm kiếm cụ thể các byte chưa ký được thêm vào sau phạm vi byte đã ký của chữ ký — một mẫu thường gặp trong việc tấn công cập nhật tăng dần một cách ngây thơ. Nó không thực hiện việc xác minh chữ ký mật mã đầy đủ. Đối với việc đó, hãy gọi validate() trên đối tượng PdfSignature riêng lẻ.

compromised and has_compromised_signatures có vẻ dư thừa

Chúng có cùng giá trị: compromised là một thuộc tính được tính toán trả về has_compromised_signatures. Hãy sử dụng bất kỳ tên nào dễ đọc hơn trong mã của bạn.

Không có ngoại lệ nào được ném ra khi tài liệu không có signatures thuộc tính nào cả

SignaturesCompromiseDetector xử lý một tài liệu không có thuộc tính signatures, hoặc document=None, giống như một tài liệu chưa ký — check() trả về kết quả với has_compromised_signatures=False và reasons=["unsigned document"] thay vì ném lỗi.

Một định dạng sai PdfSignature không được đánh dấu

check() bỏ qua bất kỳ chữ ký nào mà byte_range không phải là danh sách 4 phần tử, hoặc mà reference_data không phải là bytes/bytearray, thay vì ném lỗi hoặc báo cáo là bị xâm phạm. Một chữ ký được xây dựng với dạng sai sẽ bị loại bỏ âm thầm khỏi quá trình kiểm tra, không bị đánh dấu.

Nhầm lẫn bộ phát hiện này với việc tạo chữ ký

SignaturesCompromiseDetector và CompromiseCheckResult chỉ kiểm tra các chữ ký đã tồn tại trên tài liệu — chúng không có cách nào để tạo, áp dụng, hoặc nhúng một chữ ký mới.

Câu hỏi thường gặp

Cụ thể, “compromised” ở đây có nghĩa là gì?

Các byte có ý nghĩa, không phải khoảng trắng được thêm vào PDF sau phạm vi byte đã ký của một chữ ký — với hai ngoại lệ mà bộ phát hiện đã tính đến: một chữ ký hoặc dấu thời gian sau đó tự bao phủ các byte đó, và một bản cập nhật tăng dần chỉ thêm vật liệu xác thực (như một /DSS) mà không chồng lớp nội dung mới như chú thích.

Điều này có xác minh tính hợp lệ mật mã của chữ ký tự nó không?

Không. SignaturesCompromiseDetector kiểm tra các mẫu giả mạo xung quanh phạm vi byte đã ký. Tính hợp lệ mật mã là một kiểm tra riêng, có sẵn qua PdfSignature.validate().

Cái signatures_coverage cho tôi biết gì?

Số lượng chữ ký mà kiểm tra thực sự xem xét trên tài liệu được truyền vào — hữu ích để xác nhận bộ phát hiện đã thấy các chữ ký bạn mong đợi trước khi tin tưởng vào kết quả sạch.

Tôi có thể kiểm tra một tài liệu có nhiều chữ ký cùng một lúc không?

Có. check() lặp qua mọi mục trong signed_document.signatures và trả về một CompromiseCheckResult tổng hợp bao phủ tất cả chúng.

Trong việc sử dụng bình thường, tôi có cần tự tạo các đối tượng PdfSignature không?

Không — việc xây dựng PdfSignature ở Bước 3 chỉ dành cho việc khám phá hành vi của bộ phát hiện một cách trực tiếp. Trong quy trình thực tế, hãy truyền bất kỳ đối tượng nào mà mã tải tài liệu của bạn đã tạo ra, miễn là nó cung cấp một danh sách signatures gồm các mục có dạng PdfSignature.

Xem thêm

 Tiếng Việt