Cum să adăugați semnături de securitate PDF în Python

Cum să adăugați semnături de securitate PDF în Python

Aspose.PDF FOSS pentru Python include un detector de compromitere a semnăturii care inspectează un PDF deja semnat pentru un tipar specific de manipulare: octeți semnificativi adăugați după intervalul de octeți semnat al semnăturii, un risc unic pentru fișierele PDF actualizate incremental. Acest ghid adaugă această verificare într-un flux de lucru Python utilizând clasele SignaturesCompromiseDetector și CompromiseCheckResult. Crearea sau aplicarea de noi semnături digitale este o parte separată a bibliotecii și nu este acoperită aici. Biblioteca este instalată cu comanda de mai jos.

Ghid pas cu pas

Pasul 1: Instalați pachetul

Instalați pachetul 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 .

Verificați instalarea importând SignaturesCompromiseDetector și afișând un mesaj de confirmare:

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

Pasul 2: Importă clasele necesare

from aspose_pdf import CompromiseCheckResult, SignaturesCompromiseDetector

Pasul 3: Pregătește un obiect care expune o listă de semnături

SignaturesCompromiseDetector nu analizează un PDF în sine — constructorul său acceptă orice obiect care expune un atribut signatures: o listă de intrări de semnătură, fiecare conținând valid, byte_range și reference_data. PdfSignature — o clasă simplă, direct constructibilă — se potrivește acelei forme, astfel că este utilă pentru a vedea cum se comportă verificarea înainte de a o conecta la propriul tău obiect document:

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

Înlocuiește signed_document cu propriul tău obiect document odată ce acesta expune o listă signatures în aceeași formă — orice obiect cu acel atribut funcționează.


Pasul 4: Rulează verificarea de compromitere

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() parcurge fiecare semnătură din signed_document.signatures, căutând conținut nesemnat adăugat după intervalul de octeți semnat al fiecărei semnături. Un CompromiseCheckResult rezumă rezultatul: compromised și has_compromised_signatures raportează același boolean sub două denumiri, signatures_coverage raportează câte semnături au fost examinate, iar reasons enumeră o explicație lizibilă pentru fiecare problemă găsită.


Pasul 5: Gestionează un document fără semnături

O listă signatures goală sau absentă nu este o condiție de eroare — este raportată în același mod ca un document fără nimic de verificat:

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

Transmiterea lui SignaturesCompromiseDetector(None) — valoarea implicită a constructorului — se comportă în același mod.

Probleme comune și remedii

compromised is False pentru un PDF pe care știi că a fost editat după semnare

SignaturesCompromiseDetector caută în mod specific octeți nesemnati adăugați după intervalul de octeți semnați al unei semnături — un tipar tipic al manipulării naive prin actualizare incrementală. Nu efectuează verificarea completă a semnăturii criptografice. Pentru asta, apelează validate() pe obiectul individual PdfSignature.

compromised and has_compromised_signatures par redundante

Au aceeași valoare: compromised este o proprietate calculată care returnează has_compromised_signatures. Folosește oricare dintre nume care se potrivește mai bine în codul tău.

Nu se ridică nicio excepție când documentul nu are signatures niciun atribut

SignaturesCompromiseDetector tratează un document fără atributul signatures, sau document=None, la fel ca un document nesemnat — check() returnează un rezultat cu has_compromised_signatures=False și reasons=["unsigned document"] în loc să ridice o eroare.

Un malformat PdfSignature nu este semnalat

check() omite orice semnătură al cărei byte_range nu este o listă de 4 elemente, sau al cărei reference_data nu este bytes/bytearray, în loc să ridice o eroare sau să o raporteze ca compromisă. O semnătură construită cu forma greșită este exclusă silențios din verificare, fără a fi semnalată.

Confunderea acestui detector cu crearea semnăturii

SignaturesCompromiseDetector și CompromiseCheckResult inspectează doar semnăturile care există deja pe un document — nu au nicio metodă de a crea, aplica sau încorpora o semnătură nouă.

Întrebări frecvente

Ce contează exact ca „compromis” aici?

Octeți semnificativi, non-spațiu, adăugați la PDF după intervalul de octeți semnat al unei semnături — cu două excepții pe care detectorul le ia deja în considerare: o semnătură sau marcă temporală ulterioară care acoperă acei octeți, și o actualizare incrementală care adaugă doar material de validare (cum ar fi un /DSS) fără a suprapune conținut nou, cum ar fi adnotări.

Acest lucru verifică valabilitatea criptografică a semnăturii în sine?

Nu. SignaturesCompromiseDetector verifică tiparele de manipulare în jurul intervalului de octeți semnat. Validitatea criptografică este o verificare separată, disponibilă prin PdfSignature.validate().

Ce îmi spune signatures_coverage?

Numărul de semnături pe care verificarea le-a examinat efectiv în documentul furnizat — util pentru a confirma că detectorul a văzut semnăturile pe care le așteptați înainte de a avea încredere într-un rezultat curat.

Pot verifica un document cu mai multe semnături simultan?

Da. check() parcurge fiecare intrare din signed_document.signatures și returnează un CompromiseCheckResult agregat care le acoperă pe toate.

Trebuie să construiesc eu obiecte PdfSignature în utilizarea normală?

Nu — construcția PdfSignature din Pasul 3 este pentru a explora comportamentul detectorului direct. Într-un flux de lucru real, transmiteți orice obiect produce deja codul dvs. de încărcare a documentului, atâta timp cât expune o listă signatures de intrări cu formă PdfSignature.

Vezi și:

 Română