Cara Menambahkan Tanda Tangan Keamanan PDF di Python

Cara Menambahkan Tanda Tangan Keamanan PDF di Python

Aspose.PDF FOSS untuk Python menyertakan detektor kompromi tanda tangan yang memeriksa PDF yang sudah ditandatangani untuk pola perusakan khusus: byte yang bermakna ditambahkan setelah rentang byte yang ditandatangani oleh tanda tangan, sebuah risiko yang unik pada file PDF yang diperbarui secara inkremental. Panduan ini menambahkan pemeriksaan tersebut ke alur kerja Python menggunakan kelas SignaturesCompromiseDetector dan CompromiseCheckResult. Membuat atau menerapkan tanda tangan digital baru adalah bagian terpisah dari perpustakaan dan tidak dibahas di sini. Perpustakaan diinstal dengan perintah di bawah ini.

Panduan Langkah-demi-Langkah

Langkah 1: Instal Paket

Instal paket 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 .

Verifikasi instalasi dengan mengimpor SignaturesCompromiseDetector dan mencetak pesan konfirmasi:

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

Langkah 2: Impor Kelas yang Diperlukan

from aspose_pdf import CompromiseCheckResult, SignaturesCompromiseDetector

Langkah 3: Siapkan Objek yang Menyajikan Daftar Tanda Tangan

SignaturesCompromiseDetector tidak mem-parsing PDF secara langsung — konstruktor-nya menerima objek apa saja yang menyajikan atribut signatures: sebuah daftar entri tanda tangan, masing-masing membawa valid, byte_range, dan reference_data. PdfSignature — kelas sederhana yang dapat langsung dibangun — cocok dengan bentuk tersebut, sehingga berguna untuk melihat bagaimana pemeriksaan berperilaku sebelum menghubungkannya ke objek dokumen Anda:

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

Ganti signed_document dengan objek dokumen Anda sendiri setelah ia menyajikan daftar signatures dengan bentuk yang sama — objek apa pun dengan atribut itu akan berfungsi.


Langkah 4: Jalankan Pemeriksaan Kompromi

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() memeriksa setiap tanda tangan dalam signed_document.signatures, mencari konten yang tidak ditandatangani yang ditambahkan setelah rentang byte yang ditandatangani oleh masing-masing tanda tangan. Sebuah CompromiseCheckResult merangkum hasilnya: compromised dan has_compromised_signatures melaporkan nilai boolean yang sama dengan dua nama, signatures_coverage melaporkan berapa banyak tanda tangan yang diperiksa, dan reasons mencantumkan penjelasan yang dapat dibaca manusia untuk setiap masalah yang ditemukan.


Langkah 5: Tangani Dokumen Tanpa Tanda Tangan

Daftar signatures yang kosong atau tidak ada bukanlah kondisi kesalahan — hal ini dilaporkan dengan cara yang sama seperti dokumen yang tidak memiliki apa pun untuk diperiksa:

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

Melewatkan SignaturesCompromiseDetector(None) — nilai default konstruktor — berperilaku sama.

Masalah Umum dan Perbaikan

compromised is False untuk PDF yang Anda ketahui telah diedit setelah penandatanganan

SignaturesCompromiseDetector secara khusus mencari byte yang tidak ditandatangani yang ditambahkan setelah rentang byte yang ditandatangani oleh tanda tangan — pola yang khas dari manipulasi pembaruan inkremental yang naif. Ia tidak melakukan verifikasi tanda tangan kriptografis secara penuh. Untuk itu, panggil validate() pada objek PdfSignature individu.

compromised and has_compromised_signatures terlihat berlebihan

Keduanya memiliki nilai yang sama: compromised adalah properti terhitung yang mengembalikan has_compromised_signatures. Gunakan nama mana pun yang lebih mudah dibaca dalam kode Anda.

Tidak ada pengecualian yang dilemparkan ketika dokumen tidak memiliki signatures atribut sama sekali

SignaturesCompromiseDetector memperlakukan dokumen yang tidak memiliki atribut signatures, atau document=None, sama seperti dokumen yang tidak ditandatangani — check() mengembalikan hasil dengan has_compromised_signatures=False dan reasons=["unsigned document"] alih-alih memunculkan kesalahan.

Sebuah yang tidak terbentuk dengan benar PdfSignature tidak ditandai

check() melewati setiap tanda tangan yang byte_range-nya bukan list berisi 4 elemen, atau yang reference_data-nya bukan bytes/bytearray, alih-alih memunculkan atau melaporkannya sebagai compromised. Tanda tangan yang dibuat dengan bentuk yang salah secara diam-diam dikecualikan dari pemeriksaan, tidak ditandai.

Mengkacaukan detektor ini dengan pembuatan tanda tangan

SignaturesCompromiseDetector dan CompromiseCheckResult hanya memeriksa tanda tangan yang sudah ada pada sebuah dokumen — mereka tidak memiliki cara untuk membuat, menerapkan, atau menyematkan tanda tangan baru.

Pertanyaan yang Sering Diajukan

Apa sebenarnya yang dihitung sebagai “compromised” di sini?

Byte yang berarti, bukan spasi, yang ditambahkan ke PDF setelah rentang byte yang ditandatangani oleh sebuah tanda tangan — dengan dua pengecualian yang sudah dipertimbangkan oleh detektor: tanda tangan atau timestamp yang lebih baru yang sendiri mencakup byte tersebut, dan pembaruan inkremental yang hanya menambahkan materi validasi (seperti /DSS) tanpa menumpuk konten baru seperti anotasi.

Apakah ini memverifikasi keabsahan kriptografis tanda tangan itu sendiri?

Tidak. SignaturesCompromiseDetector memeriksa pola penyusupan di sekitar rentang byte yang ditandatangani. Keabsahan kriptografis adalah pemeriksaan terpisah, tersedia melalui PdfSignature.validate().

Apa yang signatures_coverage beri tahu saya?

Jumlah tanda tangan yang sebenarnya diperiksa oleh pemeriksaan pada dokumen yang diberikan — berguna untuk memastikan detektor melihat tanda tangan yang Anda harapkan sebelum mempercayai hasil yang bersih.

Bisakah saya memeriksa dokumen dengan banyak tanda tangan sekaligus?

Ya. check() mengiterasi setiap entri dalam signed_document.signatures dan mengembalikan satu CompromiseCheckResult agregat yang mencakup semuanya.

Apakah saya perlu membuat objek PdfSignature sendiri dalam penggunaan normal?

Tidak — konstruksi PdfSignature pada Langkah 3 dimaksudkan untuk mengeksplorasi perilaku detektor secara langsung. Dalam alur kerja nyata, serahkan objek apa pun yang sudah dihasilkan oleh kode pemuatan dokumen Anda, selama objek tersebut menyediakan daftar signatures berisi entri berbentuk PdfSignature.

Lihat Juga

 Bahasa Indonesia